捕獲.PNG
題意是將一個(gè)二維數(shù)組,螺旋遍歷出來(lái),那么從Matrix[0][0]開(kāi)始,提前記錄好上下左右四個(gè)方向的邊界,并且按照右下左上四個(gè)方向進(jìn)行遍歷。邏輯簡(jiǎn)單,代碼復(fù)雜。代碼如下:
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)+",");
}
}
}