一、题目:54. 螺旋矩阵
二、题目解析:
题目解析:维护一个上下左右边界,每次循环遍历矩阵最外层的边界,同时遍历结束,需要将边界向内缩小一圈,如果相对的两个边界相交,说明遍历完成,直接返回。
解题步骤:
- 若数组为空,直接返回答案
- 赋值上下左右边界
- 循环遍历 while(true)
3.1从左向右开始遍历直到最右,重新设定上边界,若上边界大于下边界,则遍历完成。
3.2从上向下开始遍历直到最下,重新设定右边界,若右边界小于左边界,则遍历完成。
3.3从右向左开始遍历直到最左,重新设定下边界,若下边界小于上边界,则遍历完成。
3.4从下向上开始遍历直到最上,重新设定左边界,若左边界大于右边界,则遍历完成。
图示帮助理解:
三、代码如下:
public List spiralOrder(int[][] arr){
List result = new ArrayList();
//若数组为空,直接返回答案
if(arr.length == 0){
return result;
}
//赋值上下左右边界
int up = 0;
int down = arr.length-1;
int left = 0;
int right = arr[0].length-1;
while (true){
//从左向右开始遍历直到最右,重新设定上边界,若上边界大于下边界,则遍历完成。
for (int i = left; i <=right ; i++) result.add(arr[up][i]);
if(++up>down) break;
//从上向下开始遍历直到最下,重新设定右边界,若右边界小于左边界,则遍历完成。
for (int i = up; i <=down ; i++) result.add(arr[i][right]);
if(--right<left) break;
//从右向左开始遍历直到最左,重新设定下边界,若下边界小于上边界,则遍历完成。
for (int i = right; i >=left; i--) result.add(arr[down][i]);
if (--down<up) break;
//从下向上开始遍历直到最上,重新设定左边界,若左边界大于右边界,则遍历完成。
for (int i = down;i>=up;i--) result.add(arr[i][left]);
if(++left>right) break;
}
return result;
}
四、测试
五、结束