leetcode 54. Spiral Matrix 、59. Spiral Matrix II

54题是把二维数组安卓螺旋的顺序进行打印,59题是把1到n平方的数字按照螺旋的顺序进行放置

54. Spiral Matrix

start表示的是每次一圈的开始,每次开始其实就是从(0,0)、(1,1)这种开始的。

用endx、endy来表示每次转圈的x、y方向的终止位置,方便后面进行边界条件设置。

注意:后面start < endx && start < endy、start < endy && start < endx-1都必须同时满足x、y的条件,不然会出现错误

为什么后面判断条件的时候要多个判断,因为这里使用的是4个if,如果第二个if没有执行,实际上是不应该执行第三个if,但是如果不加&&多个条件判断,代码实际上会运行。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> result;
        int row = matrix.size();
        if(row <= 0)
            return result;
        int col = matrix[0].size();
        if(col <= 0)
            return result;
        int start = 0;
        while(start*2 < row && start*2 < col){
            int endx = row - 1 - start;
            int endy = col - 1 - start;
            for(int i = start;i <= endy;i++)
                result.push_back(matrix[start][i]);
            if(start < endx){
                for(int i = start + 1;i <= endx;i++)
                    result.push_back(matrix[i][endy]);
            }
            if(start < endx && start < endy){
                for(int i = endy - 1;i >= start;i--)
                    result.push_back(matrix[endx][i]);
            }
            if(start < endy && start < endx - 1){
                for(int i = endx - 1;i >= start + 1;i--)
                    result.push_back(matrix[i][start]);
            }
            start++;
        }
        return result;
    }
};

59. Spiral Matrix II

与54题差不多,只是用一个num来表示当前存储的数字,每个计算num++

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> result(n,vector<int>(n));
        int row = n,col = n,start = 0;
        int num = 0;
        while(start*2 < row && start*2 < col){
            int endx = row - 1 - start;
            int endy = col - 1 - start;
            for(int i = start;i <= endy;i++){
                num++;
                result[start][i] = num;
            }
            if(start < endx){
                for(int i = start + 1;i <= endx;i++){
                    num++;
                    result[i][endy] = num;
                }
            }
            if(start < endx && start < endy){
                for(int i = endy - 1;i >= start;i--){
                    num++;
                    result[endx][i] = num;
                }
            }
            if(start < endy && start < endx - 1){
                for(int i = endx - 1;i >= start + 1;i--){
                    num++;
                    result[i][start] = num;
                }
            }
            start++;
        }
        return result;
    }
};
原文地址:https://www.cnblogs.com/ymjyqsx/p/10791711.html