力扣labuladong一刷day19天花式遍歷
文章目錄
- 力扣labuladong一刷day19天花式遍歷
- 一、48. 旋轉圖像
- 二、54. 螺旋矩陣
- 三、59. 螺旋矩陣 II
一、48. 旋轉圖像
題目鏈接:https://leetcode.cn/problems/rotate-image/
思路:把矩陣向右旋轉90度,要求原地操作,這里借鑒了把一個字符串里所有單詞順序給翻轉的思路,單詞順序翻轉其實是,先翻轉整個字符串,然后再翻轉每一個單詞即可完成,而不是按照空格把每一個單詞分隔開再拼回去。
把矩陣沿著左上角和右下角這條對對角線翻轉,然后再每一行橫向翻轉即可得到順時針旋轉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++) {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/
思路:每次讀取一條邊,然后每遍歷一條邊就調整邊界。
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/
思路:正方形的螺旋矩陣可以按照四條邊遍歷,每次只遍歷左閉右開,正好每次遍歷一個圈。
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;}
}