第一题:54. 螺旋矩阵
题目描述:给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 :
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]
解题思路:按层遍历,如图所示,找到规律后就差不多了
public List<Integer> spiralOrder(int[][] matrix) { int rowIndexMin = 0; int rowIndexMax = matrix.length - 1; int columnIndexMin = 0; int columnIndexMax = matrix[0].length - 1; List<Integer> result = new ArrayList<>(); while (rowIndexMin <= rowIndexMax && columnIndexMin <= columnIndexMax) { // 1、 横着走,从左到右 -> 行坐标不变 && 列坐标++ for (int j = columnIndexMin; j <= columnIndexMax; j++) { result.add(matrix[rowIndexMin][j]); } // 2、竖着走,从上到下 -> 行坐标++ && 列坐标不变 for (int i = rowIndexMin + 1; i <= rowIndexMax; i++) { result.add(matrix[i][columnIndexMax]); } if (rowIndexMin < rowIndexMax && columnIndexMin < columnIndexMax) { // 3、横着走,从右到左 -> 行坐标不变 && 坐标-- for (int j = columnIndexMax - 1; j > columnIndexMin; j--) { result.add(matrix[rowIndexMax][j]); } // 4、竖着走,从下到上 -> 行坐标-- && 坐标不变 for (int i = rowIndexMax ; i > rowIndexMin; i--) { result.add(matrix[i][columnIndexMin]); } } // 循环完后列瘦一圈 rowIndexMin++; rowIndexMax--; columnIndexMin++; columnIndexMax--; } return result; }
第二题:59. 螺旋矩阵 II
题目描述:给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1 输出:[[1]]
解题思路:这题和上面的题类似的,只不过结果和输入倒过来了,思路一样的
public static int[][] generateMatrix(int n) { int rowIndexMin = 0; int rowIndexMax = n - 1; int columnIndexMin = 0; int columnIndexMax = n - 1; int[][] result = new int[n][n]; int source = 1; while (rowIndexMin <= rowIndexMax && columnIndexMin <= columnIndexMax) { // 1、 横着走,从左到右 -> 行坐标不变 && 列坐标++ for (int j = columnIndexMin; j <= columnIndexMax; j++) { result[rowIndexMin][j] = source++; } // 2、竖着走,从上到下 -> 行坐标++ && 列坐标不变 for (int i = rowIndexMin + 1; i <= rowIndexMax; i++) { result[i][columnIndexMax] = source++; } if (rowIndexMin < rowIndexMax && columnIndexMin < columnIndexMax) { // 3、横着走,从右到左 -> 行坐标不变 && 坐标-- for (int j = columnIndexMax - 1; j > columnIndexMin; j--) { result[rowIndexMax][j] = source++; } // 4、竖着走,从下到上 -> 行坐标-- && 坐标不变 for (int i = rowIndexMax ; i > rowIndexMin; i--) { result[i][columnIndexMin] = source++; } } // 循环完后列瘦一圈 rowIndexMin++; rowIndexMax--; columnIndexMin++; columnIndexMax--; } return result; }
愿你悄悄的努力,遇见更好的自己~