python怎麼把遍歷出來的數放進列表裡_Python——迭代 Iteration
阿新 • • 發佈:2021-01-05
技術標籤:LeetCode演算法基本練習演算法
輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字。
示例1:
輸入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
輸出:[1,2,3,6,9,8,7,4,5]
示例 2:
輸入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
輸出:[1,2,3,4,8,12,11,10,9,5,6,7]
限制:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
package offer; /** * @Author WSharkCoder * @Date 2021/1/7 22:14 * @ClassName SpiralOrder * 問題: * 輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字。 * 示例1: * 輸入:matrix = [ * [1,2,3], * [4,5,6], * [7,8,9]] * 輸出:[1,2,3,6,9,8,7,4,5] * 示例2: * 輸入:matrix = [ * [1, 2, 3, 4], * [5, 6, 7, 8], * [9,10,11,12]] * 輸出:[1,2,3,4,8,12,11,10,9,5,6,7] * <p> * 限制: * 0<=matrix.length<=100 * 0<=matrix[i].length<=100 */ public class PrintMatrixClockCircle { /** * 解法一: * 構造visited 二維訪問陣列記錄元素是否訪問 * * @param matrix * @return */ public static int[] spiralOrder(int[][] matrix) { //引數校驗參考官方解法 if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { return new int[0]; } //行數 列數 int rowNum = matrix.length, colNum = matrix[0].length; //結果 int[] result = new int[rowNum * colNum]; //方向 右 下 左 上 int[][] dir = new int[][]{{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; //是否訪問 boolean[][] visited = new boolean[rowNum][colNum]; int index = 0, i = 0, j = 0, k = 0; while (index < rowNum * colNum) { result[index] = matrix[i][j]; visited[i][j] = true; index++; //判斷下一元素是否座標出界或訪問過 if ((i + dir[k][0]) >= rowNum || (j + dir[k][1]) >= colNum || (i + dir[k][0]) < 0 || (j + dir[k][1]) < 0 || visited[i + dir[k][0]][j + dir[k][1]]) { k = (k + 1) % 4; } i += dir[k][0]; j += dir[k][1]; } return result; } /** * 限界法 判斷是否超越界限 * @param matrix * @return */ public static int[] spiralOrderX(int[][] matrix) { if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { return new int[0]; } //行數 列數 int rowNum = matrix.length, colNum = matrix[0].length; //結果 int[] result = new int[rowNum * colNum]; //方向 右 下 左 上 int[][] dir = new int[][]{{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; int index = 0, i = 0, j = 0, p = 1; while (index < rowNum * colNum) { int k = 0; while (k < 4 && index < rowNum * colNum) { result[index++] = matrix[i][j]; if ((k == 0 && (j + dir[k][1]) == (colNum-p+1))|| (k == 1 && (i + dir[k][0]) == (rowNum-p+1)) || (k == 2 && (j + dir[k][1]) == (p-1-1)) || (k == 3 && (i + dir[k][0]) == (p-1))){ k++; } i += dir[k%4][0]; j += dir[k%4][1]; } p++; } return result; } public static void main(String[] args) { spiralOrderX(new int[][]{ {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }); // spiralOrderX(new int[][]{ // {1, 2, 3, 4}, // {5, 6, 7, 8}, // {9, 10, 11, 12} // }); // spiralOrderX(new int[][]{ // {1}, // {5} // }); } }