作者 | 小灰
來源 | 程序員小灰(ID:chengxuyuanxiaohui)
第二天
什麼意思呢?我們來舉個例子,給定下面這樣一個二維數組:
我們需要從左上角的元素1開始,按照順時針進行螺旋遍曆,一直遍曆完所有的元素,遍曆的路徑就像下圖一樣:
經過這樣的遍曆,返回的元素結果如下:
1,2,3,4,5,10,15,20,19,18,17,16,11,6,7,8,9,14,13,12
回公司後
第1層
從左到右遍曆“上邊”:
從上到下遍曆“右邊”:
從右到左遍曆“下邊”:
從下到上遍曆“左邊”:
第2層
從左到右遍曆“上邊”:
從上到下遍曆“右邊”:
從右到左遍曆“下邊”:
從下到上遍曆“左邊”:
第3層
從左到右遍曆“上邊”:
從上到下遍曆“右邊”:
從右到左遍曆“下邊”:
第三層的“左邊”已無需遍曆,二維數組到此遍曆完畢。
public class SpiralOrder {
public static List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list = new ArrayList<Integer>;
//當二維數組是空或任何一個維度是0,直接返回
if (matrix == || matrix.length == 0 || matrix[0].length == 0) {
return list;
}
//m是矩陣的行數
int m = matrix.length;
//n是矩陣的列數
int n = matrix[0].length;
//大循環,從外向内逐層遍曆矩陣
for(int i=0; i<(Math.min(m, n) 1)/2; i ) {
//從左到右遍曆“上邊”
for (int j=i; j<n-i; j ) {
list.add(matrix[i][j]);
}
//從上到下遍曆“右邊”
for (int j=i 1; j<m-i; j ) {
list.add(matrix[j][(n-1)-i]);
}
//從右到左遍曆“下邊”
for (int j=i 1; j<n-i; j ) {
list.add(matrix[(m-1)-i][(n-1)-j]);
}
//從下到上遍曆“左邊”
for (int j=i 1; j<m-1-i; j ) {
list.add(matrix[(m-1)-j][i]);
}
}
return list;
}
public static void main(String[] args) {
int matrix = {
{ 1, 2, 3, 4, 5 },
{ 6, 7, 8, 9, 10 },
{ 11, 12, 13, 14, 15 },
{ 16, 17, 18, 19, 20 }
};
int matrix2 = {
{ 1, 2, 3, 4, 5 },
{ 6, 7, 8, 9, 10 },
{ 11, 12, 13, 14, 15 },
{ 16, 17, 18, 19, 20 },
{ 21, 22, 23, 24, 25 }
};
List<Integer> resultList1 = spiralOrder(matrix);
System.out.println(Arrays.toString(resultList1.toArray));
List<Integer> resultList2 = spiralOrder(matrix2);
System.out.println(Arrays.toString(resultList2.toArray));
}
}
在上面的代碼中,一個大循環當中包含了4個小循環。大循環控制了每一層的遍曆,4個小循環分别實現了同一層上邊、右邊、下邊,左邊的遍曆。
當遍曆到最内層時,4個小循環并不會全都執行,比如測試代碼中matrix2的最内層隻有一個元素13,那麼執行完第1個小循環,就不會再進入後面3個小循環:
點分享
,