一、螺旋矩阵
题解链接:https://leetcode-cn.com/problems/spiral-matrix/solution/cxiang-xi-ti-jie-by-youlookdeliciousc-3/
这里的方法不需要记录已经走过的路径,所以执行用时和内存消耗都相对较小
1、首先设定上下左右边界。
2、其次向右移动到最右,此时第一行因为已经使用过了,可以将其从图中删去,体现在代码中就是重新定义上边界。
3、判断若重新定义后,上下边界交错,表明螺旋矩阵遍历结束,跳出循环,返回答案。
4、若上下边界不交错,则遍历还未结束,接着向下向左向上移动,操作过程与第一,二步同理
不断循环以上步骤,直到某两条边界交错,跳出循环,返回答案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector <int> ans; if(matrix.empty()) return ans; int u = 0; int d = matrix.size() - 1; int l = 0; int r = matrix[0].size() - 1; while(true) { for(int i = l; i <= r; ++i) ans.push_back(matrix[u][i]); if(++ u > d) break; for(int i = u; i <= d; ++i) ans.push_back(matrix[i][r]); if(-- r < l) break; for(int i = r; i >= l; --i) ans.push_back(matrix[d][i]); if(-- d < u) break; for(int i = d; i >= u; --i) ans.push_back(matrix[i][l]); if(++ l > r) break; } return ans; } };
|
螺旋矩阵2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| class Solution { public: vector<vector<int>> generateMatrix(int n) { vector<vector<int>> res(n,vector<int>(n,0)); int startx = 0, starty = 0; int loop=n/2; int mid=n/2; int count = 1; int offset = 1; int i,j;
while(loop--){ i= startx; j= starty; for (j = starty; j < starty + n - offset; j++) { res[startx][j] = count++; } for (i = startx; i < startx + n - offset; i++) { res[i][j] = count++; } for (; j > starty; j--) { res[i][j] = count++; } for (; i > startx; i--) { res[i][j] = count++; } startx++; starty++; offset += 2; } if(n%2){ res[mid][mid]=count;
} return res;
} };
|