1. 程式人生 > 其它 >python怎麼把遍歷出來的數放進列表裡_Python——迭代 Iteration

python怎麼把遍歷出來的數放進列表裡_Python——迭代 Iteration

技術標籤: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}
//        });

   }
}