基本思路:
(1)模拟遍历过程
①从左往右matrix[rowstart][i]
②从上往下matrix[i][colend]
③从右往左matrix[rowend][i]
④从下往上matrix[i][colstart]
(2)判断结束条件;
(3)记得输入合法性判断(否则runtime错误)
import java.util.ArrayList;
import java.util.List;
/* 螺旋矩阵,m行n列,以螺旋的顺序返回矩阵的每一个元素
* For example,
* Given the following matrix:
* [ 1, 2, 3 ],
* [ 4, 5, 6 ],
* [ 7, 8, 9 ]
* You should return [1,2,3,6,9,8,7,4,5].
* 解题思路:模拟遍历,
* 首先,第0行,按列遍历,从小到大,到达最后一列
* 然后,按行遍历,从小到大,到达最后一行,
* 再按列遍历,从大到小
* 最后按行遍历,从大到小
* 直到满足退出条件
*/
public class Main {
public static void main(String[] args){
int[][] m = {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15}};
spiralOrder(m);
}
public static List<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> list = new ArrayList<Integer>();
if(matrix == null || matrix.length == 0) return list;
int rowstart = 0, rowend = matrix.length - 1;
int colstart = 0, colend = matrix[0].length - 1;
while(rowstart <= rowend && colstart <= colend){
for(int i = colstart; i <= colend; i ++){
list.add(matrix[rowstart][i]);
}
for(int i = rowstart + 1; i <= rowend; i ++){
list.add(matrix[i][colend]);
}
if(rowstart != rowend){
for(int i = colend - 1; i >=colstart; i--){
list.add(matrix[rowend][i]);
}
}
if(colstart != colend){
for(int i = rowend - 1; i >rowstart; i--){
list.add(matrix[i][colstart]);
}
}
rowstart ++;
rowend --;
colstart ++;
colend --;
}
System.out.println(list);
return list;
}
}