使用四个变量表示要遍历的上下左右四个边界,使用 visited 标记遍历过的位置并防止重复遍历。
在每次遍历中,依次遍历左、下、右、上边界并缩小边界范围
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param matrix int整型vector<vector<>>
* @return int整型vector
*/
vector<int> spiralOrder(vector<vector<int> >& matrix) {
int m = matrix.size(), n = matrix[0].size();
vector<int> ans;
vector<vector<bool>> visited(m, vector<bool>(n, false));
// 遍历的上下左右四个边界
int left = 0, right = n - 1, top = 0, bottom = m - 1;
while (left <= right && top <= bottom) {
// 遍历左边界
for (int i = top; i <= bottom; i++) {
if (!visited[i][left]) {
ans.emplace_back(matrix[i][left]);
visited[i][left] = true;
}
}
left++;
// 遍历下边界
for (int i = left; i <= right; i++) {
if (!visited[bottom][i]) {
ans.emplace_back(matrix[bottom][i]);
visited[bottom][i] = true;
}
}
bottom--;
// 遍历右边界
for (int i = bottom; i >= top; i--) {
if (!visited[i][right]) {
ans.emplace_back(matrix[i][right]);
visited[i][right] = true;
}
}
right--;
// 遍历上边界
for (int i = right; i >= left; i--) {
if (!visited[top][i]) {
ans.emplace_back(matrix[top][i]);
visited[top][i] = true;
}
}
top++;
}
return ans;
}
};
时间复杂度:O(m * n),相当于遍历了数组中每个元素1次
空间复杂度:O(m * n),存储visited数组

京公网安备 11010502036488号