54.螺旋矩阵(Java)
题目描述:
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
输入:
matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:
[1,2,3,6,9,8,7,4,5]
代码实现:
import java.util.ArrayList;
import java.util.List;
//螺旋矩阵
public class Main{
public static void main(String[] args) {
//案例
int[][] matrix = new int[][]{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {11, 12, 13, 14, 15, 16, 17, 18, 19, 20}};
System.out.println(spiralOrder(matrix));//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11]
}
/**
* 定义边界之后,顺时针遍历,不断调整边界的范围
*
* @param matrix 输入数组
* @return 输出动态数组
*/
public static List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list = new ArrayList<>();//创建集合存储元素
//上边界
int up = 0;
//左边界
int left = 0;
//下边界
int down = matrix.length - 1;
//右边界
int right = matrix[0].length - 1;
//遍历
while (right >= 0 && up < down && left <= right) {//防止越界
//遍历上边界
for (int i = left; i < right; i++) {
list.add(matrix[up][i]);//行不变
}
//遍历右边界
for (int i = up; i < down; i++) {
list.add(matrix[i][right]);//列不变
}
//遍历下边界
for (int i = right; i > left; i--) {
list.add(matrix[down][i]);//行不变
}
//遍历左边界
for (int i = down; i > up; i--) {
if (left == right) {
//特判:当有超过两个元素为一列时,只存入左下角元素
list.add(matrix[down][left]);
break;
} else {
list.add(matrix[i][left]);//列不变
}
}
//四周边界缩小一个单位
up++;
right--;
down--;
left++;
}
//遍历up等于down的一行元素
if (up == down) {
for (int i = left; i <= right; i++) {
list.add(matrix[up][i]);
}
}
return list;
}
}