数组 | 59.螺旋矩阵II

题目链接:59.螺旋矩阵II

零、描述

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

例子:
示例 1:
在这里插入图片描述

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

示例 2:
输入: n = 1
输出: [[1]]

一、解法:模拟

模拟矩阵的生成。
初始位置设为矩阵的左上角,初始方向设为向右。
若下一步的位置超出矩阵边界,或者是之前访问过的位置,则顺时针旋转,进入下一个方向。如此反复直至填入 n 2 n^2 n2个元素。

关键: 在转圈的逻辑

  • 创建一个二维数组 vector<vector<int>> res(n,vector<int>(n));
  • 顺时针顺序,先固定行数,从(top,left)到(top,right)
  • 再固定列数,从(top+1,right)到(bottom,right) 【 注意:top需要+1】
  • 再固定行数,从(bottom,right-1)到(bottom,left)
  • 再固定列数,从(bottom-1,left)到(top+1,left) 【 注意:这时候由于上面top+1,所以此时到达的是top+1】
  • 走完一圈
  • 注意,此时是(top+1,left),并不是下一个循环的起点,而应该left+1
  • 起点是(top+1,left+1)
    在这里插入图片描述
class Solution {
    
    
public:
    vector<vector<int>> generateMatrix(int n) {
    
    
        vector<vector<int>> res(n,vector<int>(n));
        int up = 0, down = n - 1, left = 0, right = n - 1, index = 1;
        while(index <= n * n){
    
    
            for(int i = left; i <= right; i++){
    
    
                res[up][i] = index++;
            }
            up++;
            for(int i = up; i <= down; i++){
    
    
                res[i][right] = index++;
            }
            right--;
            for(int i = right; i >= left; i--){
    
    
                res[down][i] = index++;
            }
            down--;
            for(int i = down; i >= up; i--){
    
    
                res[i][left] = index++;
            }
            left++;
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/weifengomg/article/details/128240905