• LeetCode59.螺旋矩阵


    LeetCode59.螺旋矩阵

    1.问题描述

    给你一个正整数 n ,生成一个包含 1n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

    示例 1:

    输入:n = 3
    输出:[[1,2,3],[8,9,4],[7,6,5]]
    
    • 1
    • 2

    示例 2:

    输入:n = 1
    输出:[[1]]
    
    • 1
    • 2

    提示:

    • 1 <= n <= 20

    2.解题思路

    模拟顺时针画矩阵的过程:

    • 填充上行从左到右
    • 填充右列从上到下
    • 填充下行从右到左
    • 填充左列从下到上

    我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。

    3.代码

    python:

    from typing import List
    
    
    class Solution:
        def generateMatrix(self, n: int) -> List[List[int]]:
            nums = [[0] * n for _ in range(n)]
            startx, starty = 0, 0  # 起始点
            loop, mid = n // 2, n // 2  # 迭代次数、n为奇数时,矩阵的中心点
            count = 1  # 计数
    
            for offset in range(1, loop + 1):  # 每循环一层偏移量加1,偏移量从1开始
                for i in range(starty, n - offset):  # 从左至右,左闭右开
                    nums[startx][i] = count
                    count += 1
                for i in range(startx, n - offset):  # 从上至下
                    nums[i][n - offset] = count
                    count += 1
                for i in range(n - offset, starty, -1):  # 从右至左
                    nums[n - offset][i] = count
                    count += 1
                for i in range(n - offset, startx, -1):  # 从下至上
                    nums[i][starty] = count
                    count += 1
                startx += 1  # 更新起始点
                starty += 1
    
            if n % 2 != 0:  # n为奇数时,填充中心点
                nums[mid][mid] = count
            return nums
    
    solution = Solution()
    result = solution.generateMatrix(5)  # 传入想要生成的矩阵的大小
    for row in result:
        print(row)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    C++:

    #include 
    #include 
    
    using namespace std;
    
    class Solution {
    	public:
    		vector<vector<int>> generateMatrix(int n) {
    			vector<vector<int>> res(n, vector<int>(n, 0)); // 使用vector定义一个二维数组
    			int startx = 0, starty = 0; // 定义每循环一个圈的起始位置
    			int loop = n / 2; // 每个圈循环几次,例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理
    			int mid = n / 2; // 矩阵中间的位置,例如:n为3, 中间的位置就是(1,1),n为5,中间位置为(2, 2)
    			int count = 1; // 用来给矩阵中每一个空格赋值
    			int offset = 1; // 需要控制每一条边遍历的长度,每次循环右边界收缩一位
    			int i,j;
    			while (loop --) {
    				i = startx;
    				j = starty;
    
    				// 下面开始的四个for就是模拟转了一圈
    				// 模拟填充上行从左到右(左闭右开)
    				for (j = starty; j < n - offset; j++) {
    					res[startx][j] = count++;
    				}
    				// 模拟填充右列从上到下(左闭右开)
    				for (i = startx; i < n - offset; i++) {
    					res[i][j] = count++;
    				}
    				// 模拟填充下行从右到左(左闭右开)
    				for (; j > starty; j--) {
    					res[i][j] = count++;
    				}
    				// 模拟填充左列从下到上(左闭右开)
    				for (; i > startx; i--) {
    					res[i][j] = count++;
    				}
    
    				// 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)
    				startx++;
    				starty++;
    
    				// offset 控制每一圈里每一条边遍历的长度
    				offset += 1;
    			}
    
    			// 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
    			if (n % 2) {
    				res[mid][mid] = count;
    			}
    			return res;
    		}
    };
    
    
    int main() {
    	Solution s;
    	int n;
    	cout << "Enter the value of n: ";
    	cin >> n;
    	vector<vector<int>> matrix = s.generateMatrix(n);
    	for (int i = 0; i < matrix.size(); i++) {
    		cout << "[";
    		for (int j = 0; j < matrix[i].size(); j++) {
    			cout << matrix[i][j];
    			if (j != matrix[i].size() - 1) {
    				cout << ",";
    			}
    		}
    		cout << "]";
    		if (i != matrix.size() - 1) {
    			cout << ",";
    		}
    		cout << endl;
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
  • 相关阅读:
    [debug/main.o] Error 1 QtCreator编译报错
    Android系统悬浮球开发,在Android12上不显示的问题排查与处理。
    简单记录一下Splunk ES 升级
    华为计算开源总经理堵俊平:AI领域开源新趋势与思考
    (附源码)spring boot酒店管理平台 毕业设计 201010
    树和二叉树的概念与使用(Tree&Binary Tree)
    Spring Cloud入门看这一篇就够了
    iOS Flutter Engine源码调试和修改
    SpotBugs代码检查:在整数上进行没有起任何实际作用的位操作(INT_VACUOUS_BIT_OPERATION)
    docker服务CPU飙高排查
  • 原文地址:https://blog.csdn.net/liuxudanhahaha/article/details/134563021