一:题目
二:上码
class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> ans;int startx = 0,starty = 0;int n = matrix.size();//求出行int m = matrix[0].size();//求出列int loop = m/2 <= n/2 ? m/2 : n/2;//loop表示有几圈int border = 1;//每次遍历一行的边界 具体看代码int i,j;while(loop--){i = startx;j = starty;//取值上方 从左到右(左闭右开)for(j = starty; j < starty + m - border; j++){ans.push_back(matrix[i][j]);//行不变 列变}//取值右方 从上到下for(i = startx; i < startx + n - border; i++){ans.push_back(matrix[i][j]);//行变 列不变}//取值下方 从左到右for(; j > starty; j--){ans.push_back(matrix[i][j]);}//取值左方 从下到上for(; i > startx; i--){ans.push_back(matrix[i][j]);}startx++;starty++;border+=2;}if(n%2 != 0 || m%2 != 0){if(n < m && n % 2 != 0){//说明列多 当行少的时候,行不能为偶数 否则就是完整的圈数int mid = n/2;int len = mid + (m-n);for(int j = mid; j <= len; j++){//行不变 列在变ans.push_back(matrix[mid][j]);}}else if(n > m && m%2 != 0){//说明行多 当列多的时候,列不能为偶数 否则就是完整的圈数int mid = m/2;int len = mid + (n-m);for(int i = mid; i <= len; i++){ans.push_back(matrix[i][mid]);//列不变 行在变}}else if(m == n){//说明 n==mint mid = n/2;ans.push_back(matrix[mid][mid]);//当m 和 n都为奇数的时候 就剩下中间一个} }return ans;}
};
这个比上个题需要注意的是 二维数组的行和列不相等,所以我们需要特殊处理。