Leetcode54 螺旋矩阵一
题目描述:给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
思路:
典型的DFS问题。通过设立方向数组和标记数组即可实现。期间遇到的坑和知识点如下。
- 判断二维数组为空的方式,分别用于判断数组不存在、{}、{{}}三种情况。
if((matrix==null||matrix.length==0)||(matrix.length==1&&matrix[0].length==0))
- 和传统的迷宫问题不同,此问题规定按照顺时针方向返回元素,即下一步移动方向是在当前步移动方向的基础上进行顺时针移动。换言之,方向不能每次都重置,而是基于之前的方向。
第一次未通过,原因是我错误地按照迷宫问题思路将方向不断重置,即每次都是按照右-下-左-上的顺序进行判断,违背了顺时针原则。出问题的代码如下:
for(int d=0;d<4;d++){
int newX = x + direction[d][0];
int newY = y + direction[d][1];
if(newX>=0&&newX<m&&newY>=0&&newY<n&&visit[newX][newY]==0){
x = newX;
y = newY;
break;
}
}
修改后代码:
if(newX >= 0 && newX < m && newY >= 0 && newY < n && visit[newX][newY] == 0){
x = newX;
y = newY;
} else {
d = (d + 1) % 4;
x = x + direction[d][0];
y = y + direction[d][1];
}
最终代码:
public class Lc54 {
public static void main(String[] args) {
int[][] input = new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
List<Integer> list = new ArrayList<Integer>();
list = spiralOrder(input);
System.out.println(list);
}
public static List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list = new ArrayList<Integer>();
if ((matrix == null || matrix.length == 0) || (matrix.length == 1 && matrix[0].length == 0)) return list;
int[][] direction = new int[][]{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int m = matrix.length;
int n = matrix[0].length;
int[][] visit = new int[m][n];
int x = 0, y = 0, d = 0;
for (int i = 0; i < m * n; i++) {
list.add(matrix[x][y]);
visit[x][y] = 1;
int newX = x + direction[d][0];
int newY = y + direction[d][1];
if (newX >= 0 && newX < m && newY >= 0 && newY < n && visit[newX][newY] == 0) {
x = newX;
y = newY;
} else {
d = (d + 1) % 4;
x = x + direction[d][0];
y = y + direction[d][1];
}
}
return list;
}
}
输出:
[1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10]
Leetcode59 螺旋矩阵二
题目描述:给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
思路同上题,代码也几乎相同,有了解决上道题的经验,这道题就显得游刃有余。
最终代码:
public class Lc59 {
public static void main(String[] args) {
int n = 5;
int[][] target = generateMatrix(n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.printf("%3d",target[i][j]);
}
System.out.println();
}
}
public static int[][] generateMatrix(int n) {
int[][] target = new int[n][n];
int[][] visit = new int[n][n];
int[][] direction = new int[][]{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int x = 0, y = 0, d = 0;
for (int i = 1; i <= n * n; i++) {
target[x][y] = i;
visit[x][y] = 1;
int newX = x + direction[d][0];
int newY = y + direction[d][1];
if(newX >= 0 && newX < n && newY >= 0 && newY < n && visit[newX][newY] == 0){
x = newX;
y = newY;
} else {
d = (d + 1) % 4;
x = x + direction[d][0];
y = y + direction[d][1];
}
}
return target;
}
}
输出:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9