59.螺旋矩阵II
力扣题目链接
给你一个正整数 ,生成一个包含 到 所有元素,且元素按顺时针顺序螺旋排列的 正方形矩阵 。
示例 1:
1 2
| 输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]
|
示例 2:
提示:
1 <= n <= 20
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/spiral-matrix-ii
思路
模拟矩阵的生成。需要特别注意循环不变原则。
(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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| class Solution { public: vector<vector<int>> generateMatrix(int n) { int left = 0, top = 0; int right = n - 1, bottom = n - 1; int index = 1; int i = 0, j = 0; vector<vector<int>> ans(n, vector<int>(n, 0)); while (top <= bottom || left <= right) { if (j == left && i == top) { while (j <= right) { ans[i][j++] = index; index++; } top++; i++; j--; } if (i == top && j == right) { while (i <= bottom) { ans[i++][j] = index; index++; } right--; j--; i--; } if (i == bottom && j == right) { while (j >= left) { ans[i][j--] = index; index++; } bottom--; i--; j++; } if (i == bottom && j == left) { while (i >= top) { ans[i--][j] = index; index++; } left++; j++; i++; } }
return ans; } };
|
- 时间复杂度 : 模拟遍历二维矩阵的时间
- 空间复杂度
不带注释:
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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| class Solution { public: vector<vector<int>> generateMatrix(int n) { int left = 0, top = 0; int right = n - 1, bottom = n - 1; int index = 1; int i = 0, j = 0; vector<vector<int>> ans(n, vector<int>(n, 0)); while (top <= bottom || left <= right) { if (j == left && i == top) { while (j <= right) { ans[i][j++] = index; index++; } top++; i++; j--; } if (i == top && j == right) { while (i <= bottom) { ans[i++][j] = index; index++; } right--; j--; i--; } if (i == bottom && j == right) { while (j >= left) { ans[i][j--] = index; index++; } bottom--; i--; j++; } if (i == bottom && j == left) { while (i >= top) { ans[i--][j] = index; index++; } left++; j++; i++; } } return ans; } };
|