Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.java
給定一個包含 m x n 個元素的矩陣(m 行, n 列),請按照順時針螺旋順序,返回矩陣中的全部元素。python
Example 1:數組
Input: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] Output: [1,2,3,6,9,8,7,4,5]
Example 2:app
Input: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] Output: [1,2,3,4,8,12,11,10,9,5,6,7]
參考例二,觀察索引改變方式:(0,0)--->(0,3)、(0,3)--->((2,3)--->(2,0)--->(1,0)--->(1,2)code
從(0,3)看,分別是:向下 橫座標自增1,到2;向左:縱座標自減1 ,到0;向上橫座標自減1,到1;向右縱座標自增1,到2索引
假如m*n的矩陣,從(0,m-1)開始,向下移動n-1次到達最下面,再向左m-1次,向上n-2次,向右m-2次,接着就是:向下n-3,向左m-3,向上n-4,向右m-4。每次轉向m或n都會自減1。element
這是個人思路,網上不少都是直接操做索引座標,我以爲不是很好理解,由於超過一個螺旋的矩陣,每次都要更改參考座標,不過兩種方法本質差異不大it
class Solution { public List<Integer> spiralOrder(int[][] matrix) { List nums=new ArrayList(); if (matrix.length==0||matrix[0].length==0)return nums ; int row=matrix.length-1,col=matrix[0].length-1,m=0,n=0,i=-1,tmp=0; while (row>=0&&col>=0){ switch (i++%4){ case 0: for (tmp=0;tmp<row;tmp++) nums.add(matrix[++m][n]);row-=1; break; case 1: for (tmp=0;tmp<col;tmp++) nums.add(matrix[m][--n]);col-=1; break; case 2: for (tmp=0;tmp<row;tmp++) nums.add(matrix[--m][n]);row-=1; break; case 3: for (tmp=0;tmp<col;tmp++) nums.add(matrix[m][++n]);col-=1; break; default: for (tmp=0;tmp<=col;tmp++) nums.add(matrix[m][n++]);tmp=0;n-=1; break; } } return nums; } }
先判斷是否爲空數組,判斷條件順序不能顛倒。由於若是 matrix.length==0
判斷爲true,則後面的 matrix[0].length==0
不會再判斷,即返回空數組;可是matrix[0].length==0
在前時,若是輸入數組爲空,matrix[0]
會報錯由於matrix並無0號索引。io
class Solution: def spiralOrder(self, matrix: List[List[int]]) -> List[int]: if len(matrix)==0 or len(matrix[0])==0:return [] nums=[];m=0;n=0;row=len(matrix)-1;col=len(matrix[0])-1;flag=0; for n in range(col+1):nums.append(matrix[m][n]) while row>=0 and col>=0: if flag % 4 == 0: for i in range(row): m+=1 nums.append(matrix[m][n]) row -= 1 elif flag % 4==1: for i in range(col): n-=1 nums.append(matrix[m][n]) col -= 1 elif flag % 4 == 2: for i in range(row): m-=1 nums.append(matrix[m][n]) row -= 1 elif flag % 4 == 3: for i in range(col): n+=1 nums.append(matrix[m][n]) col -= 1 flag+=1 return nums
python沒有switch...case...語句。for循環可操做性很高,能夠直接操做索引座標改變遍歷方式,再也不贅述。 for循環