LeetCode 59.螺旋矩阵2

104 阅读1分钟

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

59.螺旋矩阵2

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

 

示例 1:

image.png

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

示例 2:

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

提示:

  • 1 <= n <= 20

二、思路分析

这道题目并没有涉及到什么算法。但难度我个人觉得还是挺大的。

给人一种无从下手的感觉。因为每转一圈起始点和终止点都会发生变化,这就是很让人头疼的事。

最后的解法是:设置了i和j,也设置了startx和starty这两个值作为每次循环遍历时行和列的起始位置。同时,i和j则是不断移动的。设置了count,从1开始,随着行和列的遍历依次对二维数组ans进行赋值,然后自加1。

要考虑到n为奇数的情况,也就是转完圈后最中间的一个值没有被填充,所以我们要考虑判断n是否为奇数,如果为奇数的话,则应该在最后把中间的值填好,这一点要油漆的注意。

然后就是注意边界条件。代码如下

三、AC代码

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int startx=0,starty=0;
        int offset=1,count=1;
        int i,j;
        int loop=n/2;
        vector<vector<int>>ans(n,vector<int>(n,0));
        while(loop--){
     
            for(j=starty;j<n-offset;j++){
                ans[startx][j]=count++;
            }
            for(i=startx;i<n-offset;i++){
                ans[i][j]=count++;
            }
            for(j;j>starty;j--){
                ans[i][j]=count++;
            }
            for(i;i>startx;i--){
                ans[i][starty]=count++;
            }
        
            starty++;
            startx++;
            offset++;
        }
        if(n%2==1){
            ans[n/2][n/2]=count;
        }
        return ans;

    }
};

四、总结

题目比较不好确定边界条件,如果能理清边界条件的话就比较好做。