剑指 Offer 29. 顺时针打印矩阵
题目
题解
以前随手写过一次,当时写的时候,没有测试很多用例其实有问题传送门
解题思路
定义上下左右四个边界,按顺时针扫描边界的行和列,扫描完一行或者一列之后更新边界值并判断边界。
本来使用while(left < right || left < down)
为循环判断条件。其实这样不可以,可能会重复添加,如果换成 &&
号,则可能会少添加。
故只好边添加,边判断。只要不符合,只要不符合条件就跳出循环。
show your code
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int n1 = matrix.size(); // 行
if (!n1) return {};
int n2 = matrix[0].size(); // 列
int up = 0, down = n1 - 1, left = 0, right = n2 - 1;
vector<int> ans;
while (true){
// 先上 面的 行。
for (int i = left; i <= right; i ++ ) ans.push_back(matrix[up][i]);
if ( ++ up > down) break;
for (int i = up; i <= down; i ++ ) ans.push_back(matrix[i][right]);
if ( -- right < left) break;
for (int i = right; i >= left; i -- ) ans.push_back(matrix[down][i]);
if (-- down < up) break;
for (int i = down; i >= up; i -- ) ans.push_back(matrix[i][left]);
if ( ++ left > right) break;
}
return ans;
}
};
喜欢的话,给博主赏一杯冰阔乐吧