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; } };