文章目录
- 题目
- 方法一:按层模拟
题目
方法一:按层模拟
思路就是定义四个指针边界,按顺序扫完一遍,再缩小区域再扫描
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> order = new ArrayList<Integer>();
int matrixlength = matrix.length;
int matrixNumlength = matrix[0].length;
//判空条件
if(matrix==null || matrixlength == 0 || matrixNumlength == 0) return order;
//定义四个指针边界
int top = 0;//行边界
int bot = matrixlength-1;
int left = 0;//列边界
int right = matrixNumlength-1;
while(left <= right && top <= bot){
// 首先循环最外层 顺序依次为右下左上
// (left) (right)
// (top)1, 2, 3, 4 (top)
// 5, 6, 7, 8
// (bot)9, 10, 11, 12(bot)
// (left) (right)
//右 --> 左 最上层
for(int i = left ;i <= right;i++){
order.add(matrix[top][i]);
}
//上 --> 下 最右层
for(int i = top+1 ;i <= bot;i++){
order.add(matrix[i][right]);
}
if(left!=right && bot!=top){// 如果right和left重合了 说明上往下扫描了一遍,就不需要再从下往上重复扫一遍了
// 如果 bot 和 top 重合了 说明左往右扫描了一遍,就不需要再从右往左重复扫一遍了
//左 --> 右 最下层
for(int i = right-1 ;i >= left;i--){
order.add(matrix[bot][i]);
}
//下 --> 上 最左层
for(int i = bot-1 ;i >top;i--){
order.add(matrix[i][left]);
}
}
//往里缩一圈
left ++;
right --;
top ++;
bot --;
}
return order;
}