
1.模拟路径
思路:模拟旋转的路径
(1)设计上下左右方向控制器以及边界。比如zy=1向右,zy=-1向左;sx=1向上,sx=-1向下。上边界0,下边界hang-1,左边界=0,右边界=lie-1
(2)然后根据是否到达边界,来改变方向与边界。
具体代码
(1)为什么我一开始上边界为1,因为一开始就向右移动,说明以及来到过上边界一次了,所以优先进行收缩一个单位。
(2)为什么count=flag-1的时候还需要再加入一个元素,因为我这个循环代码设计的原因,每次都取不到当前方向的最后一个值,导致在最后一个元素永远取不到,所以就人为补充最后的元素。还是设计的不好。
java
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> ans = new ArrayList<>();
int sx=0;
int zy=1;
int s_mar=1,x_mar=matrix.length-1,y_mar=matrix[0].length-1,z_mar=0;
int flag=(x_mar+1)*(y_mar+1);
int hang=0;
int lie=0;
int count=0;
while(true){
if(sx==1){
while(hang>s_mar){
ans.add(matrix[hang][lie]);
hang--;
count++;
}
sx=0;
zy=1;
s_mar++;
if(count==flag-1){
ans.add(matrix[hang][lie]);
return ans;
}
}
if(sx==-1){
while(hang<x_mar){
ans.add(matrix[hang][lie]);
hang++;
count++;
}
sx=0;
zy=-1;
x_mar--;
if(count==flag-1){
ans.add(matrix[hang][lie]);
return ans;
}
}
if(zy==1){
while(lie<y_mar){
ans.add(matrix[hang][lie]);
lie++;
count++;
}
y_mar--;
zy=0;
sx=-1;
if(count==flag-1){
ans.add(matrix[hang][lie]);
return ans;
}
}
if(zy==-1){
while(lie>z_mar){
ans.add(matrix[hang][lie]);
lie--;
count++;
}
z_mar++;
zy=0;
sx=1;
if(count==flag-1){
ans.add(matrix[hang][lie]);
return ans;
}
}
}
}
}