跳至主要內容

LeetCode 59.螺旋矩阵Ⅱ

张威大约 1 分钟数据结构与算法数组

LeetCode 59.螺旋矩阵Ⅱopen in new window

**题目描述:**给定正整数n,将1到n²按顺时针顺序填入n×n的正方形矩阵,返回该矩阵。

img
img
  • 循环不变量:考虑每一圈的四条边按左闭右开进行处理

思路:

  • 每一圈从(startx, starty)位置开始
    • 上:行号不变,列号从 starty(闭)到 starty + n - offset(开)
    • 右:行号从 startx(闭)到 startx + n - offset(开),列号不变
    • 下:行号不变,列号从 starty + n - offset(闭)到 starty(开)
    • 左:行号从 startx + n - offset(闭)到 startx(开)
    • 更新startx、starty、offset(每次+2)
  • n为奇数,单独处理中心位置

![img](LeetCode 59.螺旋矩阵Ⅱ.assets/d8bc6e4874094de4849792b5a05963c0.png)

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int offSet = 1;
        int count = 1;
        int startx = 0;
        int starty = 0;
        int loop = 0;
        vector<vector<int>> result(n,vector<int>(n,0));	//定义一个返回值
        while(loop < n/2) {//根据规律找需要循环的次数
            int i = startx;
            int j = starty;  
            for(; j < n - offSet; ++j) {//前闭后开
                result[i][j] = count++;
            }
            for(; i < n - offSet; ++i) {
                result[i][j] = count++;
            }
            for(; j > starty ; --j) {
                result[i][j] = count++;
            }
            for(; i > startx; --i) {
                result[i][j] = count++;
            }
            ++offSet;	//n - offSet为x末端
            ++startx;	//x的前端
            ++starty;
            ++loop;	//循环次数
        }
        if(n % 2 == 1) {//若为奇数,会剩最后一个
            result[n/2][n/2] = count;//最后一个元素
        }
        return result;
    }
};