- 59. 螺旋矩阵 II">59. 螺旋矩阵 II
- 54. 螺旋矩阵">54. 螺旋矩阵
- 48. 旋转图像(此题并非螺旋矩阵,只是一个二维数组的旋转)">48. 旋转图像(此题并非螺旋矩阵,只是一个二维数组的旋转)
59. 螺旋矩阵 II
本题并不涉及到什么算法,就是模拟过程
这里使用一个左闭右开区间
使用四个边界去逐步缩小矩阵范围
int[][] generateMatrix(int n) {int[][] matrix = new int[n][n];int upper_bound = 0, lower_bound = n - 1;int left_bound = 0, right_bound = n - 1;// 需要填入矩阵的数字int num = 1;while (num <= n * n) {if (upper_bound <= lower_bound) {// 在顶部从左向右遍历for (int j = left_bound; j <= right_bound; j++) {matrix[upper_bound][j] = num++;}// 上边界下移upper_bound++;}if (left_bound <= right_bound) {// 在右侧从上向下遍历for (int i = upper_bound; i <= lower_bound; i++) {matrix[i][right_bound] = num++;}// 右边界左移right_bound--;}if (upper_bound <= lower_bound) {// 在底部从右向左遍历for (int j = right_bound; j >= left_bound; j--) {matrix[lower_bound][j] = num++;}// 下边界上移lower_bound--;}if (left_bound <= right_bound) {// 在左侧从下向上遍历for (int i = lower_bound; i >= upper_bound; i--) {matrix[i][left_bound] = num++;}// 左边界右移left_bound++;}}return matrix;}
出错的地方
- matrix[][]总是写错
- 要明确left; right; up; down 的含义 他们是用来当界限逐渐去缩小区间范围的,就比如当left到rigth的过程中,我们让left自增,条件是left<=right 当我们for循环后需要让上边界缩小就是up++
54. 螺旋矩阵
按照59题的思路书写超出时间限制 (我写错了而已….太菜了)
class Solution {public List<Integer> spiralOrder(int[][] matrix) {int m = matrix.length, n = matrix[0].length;int up= 0, down = m - 1;int left = 0, right = n - 1;List<Integer> res = new LinkedList<>();//当res.size==m*n时说明遍历完整个数组while (res.size() < m*n){if(up <= down) {for (int i = left; i <= right; i++) {res.add(matrix[up][i]);}up++;}if(left<=right) {for (int i = up; i <= down; i++) {res.add(matrix[i][right]);}right--;}if (up <= down) {for (int i = right; i >= left; i--) {res.add(matrix[down][i]);}down--;}if (left<=right) {for (int i = down; i >= up; i--) {res.add(matrix[i][left]);}left++;}}return res;}}
48. 旋转图像(此题并非螺旋矩阵,只是一个二维数组的旋转)
反转二维数组90°
先沿着对角线反转
然后每一行反转
class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
// 先沿对角线反转二维矩阵
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
// swap(matrix[i][j], matrix[j][i]);
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
// 然后反转二维矩阵的每一行
for (int[] row : matrix) {
reverse(row);
}
}
// 反转一维数组
void reverse(int[] arr) {
int i = 0, j = arr.length - 1;
while (j > i) {
// swap(arr[i], arr[j]);
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
}
}
同样的逆时针旋转90°只要通过另一条对角线镜像对称矩阵,然后再反转每一行,就得到了逆时针旋转矩阵的结果:
翻译成代码如下:
// 将二维矩阵原地逆时针旋转 90 度
void rotate2(int[][] matrix) {
int n = matrix.length;
// 沿左下到右上的对角线镜像对称二维矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - i; j++) {
// swap(matrix[i][j], matrix[n-j-1][n-i-1])
int temp = matrix[i][j];
matrix[i][j] = matrix[n - j - 1][n - i - 1];
matrix[n - j - 1][n - i - 1] = temp;
}
}
// 然后反转二维矩阵的每一行
for (int[] row : matrix) {
reverse(row);
}
}
void reverse(int[] arr) { /* 见上文 */}
