题目链接:
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
解题思路:
1.首先设定上下左右边界,top,bottom,left,right
2.其次向右移动到最右,此时第一行因为已经使用过了,所以我们要重新定义上边界
3.若重新定义后,上下边界交错,表明螺旋矩阵遍历结束,跳出循环,返回答案
4.若上下边界不交错,则遍历还未结束,接着向下向左向上移动,操作过程与第一,二步同理,不断循环以上步骤,直到某两条边界交错,跳出循环,返回答案
代码如下:
import java.util.ArrayList;
import java.util.List;
//给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
public class Main {
public static void main(String[] args) {
int[][] matrix = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//[1,2,3,4,8,12,11,10,9,5,6,7]
System.out.println(spiralOrder(matrix));
}
public static List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list = new ArrayList<>();
if (matrix.length == 0) return list;//如果为空,直接输出
int row = matrix.length;//行
int col = matrix[0].length;//列
int top = 0;//上边界
int bottom = row-1;//下边界
int left = 0;//左边界
int right = col-1;//右边界
while (true){
for (int i = left;i<=right;i++){//向右移动到右边界
list.add(matrix[top][i]);
}
if (++top > bottom) break;//重新定义上边界
for (int i = top;i<=bottom;i++){//向下移动到下边界
list.add(matrix[i][right]);
}
if (--right < left) break;//重新定义右边界
for (int i = right;i>=left;i--){//向左移动到左边界
list.add(matrix[bottom][i]);
}
if (--bottom < top) break;//重新定义下边界
for (int i = bottom;i>=top;i--){//向上移动到上边界
list.add(matrix[i][left]);
}
if (++left > right) break;//重新定义左边界
}
return list;
}
}