使用四个变量表示要遍历的上下左右四个边界,使用 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数组