1.題目描述
2.思路*
思路1:
補充2:
directions[1][0] // 表示“下”這個方向的行增量(+1)
directions[1][1] // 表示“下”這個方向的列增量(0)
int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
(1) directions[0]={0,1},directions[0][0]=0,directions[0][1]=1
(2) directions[1]={1,0},directions[1][0]=1,directions[1][1]=0
(3)directions[2]={0,-1},directions[2][0]=0,directions[2][1]=-1
(4) directions[3]={-1,0},directions[3][1]=-1,directions[3][2]=0
3.代碼實現
方法一:不帶測試用例
class Solution {public List<Integer> spiralOrder(int[][] matrix) {//1.定義一個List,用來存儲列表中的值List<Integer> order=new ArrayList<Integer>();//2.如果遇到是空矩陣,或者是行矩陣,或者是列矩陣,直接返回當前列表if(matrix==null||matrix.length==0||matrix[0].length==0){return order;}//3.計算行數,計算列數int rows=matrix.length;int columns=matrix[0].length;//4.定義一個訪問數組boolean[][] visited=new boolean[rows][columns];//5.記錄總元素個數int total=rows*columns;//6.定義行值和列值int row=0;int column=0;//7.定義一個方向數組int[][] directions={{0,1},{1,0},{0,-1},{-1,0}};//8.當前的方向索引先置為0,順序是右下左上int directionsindex=0;//9.遍歷所有元素,把原有矩陣的值先添加的orde中,并將訪問位置為true.for(int i=0;i<total;i++){order.add(matrix[row][column]);visited[row][column]=true;int nextRow=row+directions[directionsindex][0];int nextColumn=column+directions[directionsindex][1];//10.如果出現越界(上下左右),或者是已訪問,更新方向索引的值,讓它換個方向if(nextRow<0||nextColumn<0||nextRow>=rows||nextColumn>=columns||visited[nextRow][nextColumn]==true){directionsindex=(directionsindex+1)%4;}//11.更新當前行列坐標,朝當前方向繼續前進row=row+directions[directionsindex][0];column=column+directions[directionsindex][1];}//12.返回結果列表return order;}
}
方法二:帶測試用例
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;public class H54 {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> order=new ArrayList<Integer>();//1.如果遇到空矩陣,或者行矩陣,或者列矩陣。直接返回當前矩陣的值if(matrix==null||matrix.length==0||matrix[0].length==0){return order;}//2.求當前二維矩陣總的行和列int rows= matrix.length;int columns=matrix[0].length;//3.設計一個bool矩陣,用來存儲參觀過的元素boolean[][] visited=new boolean[rows][columns];//4.定義一個方向矩陣,定義從(0,0)元素開始的右下左上矩陣int[][] directions={{0,1},{1,0},{0,-1},{-1,0}};//5.定義一個方向的初始索引int directionsIndex=0;//6.計算總的矩陣元素int total=rows*columns;//7.定義當前的行值和列值int row=0;int column=0;for(int i=0;i<total;i++){//9.遍歷所有元素,把原有矩陣的值先添加的order中,并將訪問位置為0.order.add(matrix[row][column]);visited[row][column]=true;//10.更新下一步的方向int nextRow=row+directions[directionsIndex][0];int nextColumn=column+directions[directionsIndex][1];if(nextRow<0||nextColumn<0||nextRow>=matrix.length||nextColumn>=matrix[0].length||visited[nextRow][nextColumn]==true){directionsIndex=(directionsIndex+1)%4;}//11.更新當前行列坐標,朝當前方向繼續前進row=row+directions[directionsIndex][0];column=column+directions[directionsIndex][1];}return order;}public static void main(String[] args){H54 test08=new H54();int[][] matrix={{1,2,3},{4,5,6},{7,8,9}};List<Integer> res=new ArrayList<Integer>();res=test08.spiralOrder(matrix);System.out.println("輸出結果"+res);}
}