力扣labuladong一刷day19天花式遍历
文章目录
-
-
- 力扣labuladong一刷day19天花式遍历
- [一、48. 旋转图像](#一、48. 旋转图像)
- [二、54. 螺旋矩阵](#二、54. 螺旋矩阵)
- [三、59. 螺旋矩阵 II](#三、59. 螺旋矩阵 II)
-
一、48. 旋转图像
题目链接:https://leetcode.cn/problems/rotate-image/
思路:把矩阵向右旋转90度,要求原地操作,这里借鉴了把一个字符串里所有单词顺序给翻转的思路,单词顺序翻转其实是,先翻转整个字符串,然后再翻转每一个单词即可完成,而不是按照空格把每一个单词分隔开再拼回去。
把矩阵沿着左上角和右下角这条对对角线翻转,然后再每一行横向翻转即可得到顺时针旋转90度。
java
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++) {
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
for (int[] nums : matrix) {
int i = 0, j = nums.length-1;
while (i < j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
i++;
j--;
}
}
}
}
二、54. 螺旋矩阵
题目链接:https://leetcode.cn/problems/spiral-matrix/
思路:每次读取一条边,然后每遍历一条边就调整边界。
java
class Solution {
List<Integer> spiralOrder(int[][] matrix) {
int m = matrix.length, n = matrix[0].length;
int upper_bound = 0, lower_bound = m - 1;
int left_bound = 0, right_bound = n - 1;
List<Integer> res = new LinkedList<>();
// res.size() == m * n 则遍历完整个数组
while (res.size() < m * n) {
if (upper_bound <= lower_bound) {
// 在顶部从左向右遍历
for (int j = left_bound; j <= right_bound; j++) {
res.add(matrix[upper_bound][j]);
}
// 上边界下移
upper_bound++;
}
if (left_bound <= right_bound) {
// 在右侧从上向下遍历
for (int i = upper_bound; i <= lower_bound; i++) {
res.add(matrix[i][right_bound]);
}
// 右边界左移
right_bound--;
}
if (upper_bound <= lower_bound) {
// 在底部从右向左遍历
for (int j = right_bound; j >= left_bound; j--) {
res.add(matrix[lower_bound][j]);
}
// 下边界上移
lower_bound--;
}
if (left_bound <= right_bound) {
// 在左侧从下向上遍历
for (int i = lower_bound; i >= upper_bound; i--) {
res.add(matrix[i][left_bound]);
}
// 左边界右移
left_bound++;
}
}
return res;
}
}
三、59. 螺旋矩阵 II
题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
思路:正方形的螺旋矩阵可以按照四条边遍历,每次只遍历左闭右开,正好每次遍历一个圈。
java
class Solution {
public int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
int k = 1;
for (int i = 0; i < n / 2; i++) {
for (int j = i; j < n-i-1; j++) {
matrix[i][j] = k++;
}
for (int j = i; j < n-i-1; j++) {
matrix[j][n-i-1] = k++;
}
for (int j = n-i-1; j > i; j--) {
matrix[n-i-1][j] = k++;
}
for (int j = n-i-1; j > i; j--) {
matrix[j][i] = k++;
}
}
if (n % 2 == 0) return matrix;
matrix[n/2][n/2] = k;
return matrix;
}
}