题意是将一个二维数组,螺旋遍历出来,那么从Matrix[0][0]开始,提前记录好上下左右四个方向的边界,并且按照右下左上四个方向进行遍历。逻辑简单,代码复杂。代码如下:
public class spiralOrder {
public static List<Integer> spiralOrder(int[][] matrix) {
if(matrix.length==0)return new ArrayList<>();
List<Integer> res = new ArrayList<>();
int top=0,left=0,count=0,i=0,k=0;
int right = matrix[0].length;
int bottom = matrix.length;
int sum = right * bottom;
String direction = "right";
while(res.size()<sum){
if(direction.equals("right")){
while(k<matrix[0].length && k<right){
res.add(matrix[i][k++]);
if(res.size()>=sum)break;
}
direction = "down";
top++;
k--;
i++;
}else if(direction.equals("down")){
while(i<matrix.length && i<bottom){
res.add(matrix[i++][k]);
if(res.size()>=sum)break;
}
direction = "left";
right--;
i--;
k--;
}else if(direction.equals("left")){
while(k>=0 && k>=left){
res.add(matrix[i][k--]);
if(res.size()>=sum)break;
}
direction = "up";
bottom--;
k++;
i--;
}else if(direction.equals("up")){
while(i>=0 && i>=top){
res.add(matrix[i--][k]);
if(res.size()>=sum)break;
}
direction = "right";
left++;
i++;
k++;
}
}
return res;
}
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},
{21,22,23,24,25}};
List<Integer> res = spiralOrder(matrix);
for(int i=0;i<res.size();i++){
System.out.print(res.get(i)+",");
}
}
}
网友评论