题目描述
给定M×N个元素的矩阵(M行,N列),以对角线顺序返回矩阵的所有元素,如下图所示。
解题思路
题目做了四十多分钟没做出来。。。就参考了github上的代码,地址
题目本身很容易理解,就是按照图中的方法遍历
一遍数组。
遍历路线有两种方式:向↗
走 、 向↙
走。
- 首先向
↗
方向走,当下一个位置不在数组内时,那么会出现两种情况,向→
走一步,或者向↓
走一步,这时就可以通过下一个位置是否在数组内进行判断了(先判断是否可以向→
走); - 前进一步后,方式改变为向
↙
,继续前进; - 当下一个位置不在数组内时,又会出现两种情况,向
↓
走一步,或者向→
走一步,也是通过下一位置是否在数组内进行判断。 - 前进一步后,改变方向为向
↗
; - 重复上述步骤,直到遍历完成。
题解代码中很巧妙的对下一位置进行判断,来确定下一步的走向。
参考代码
class Solution {
private int n;
private int m;
int[] findDiagonalOrder(int[][] matrix) {
n = matrix.length;
if(n == 0)
return new int[0];
m = matrix[0].length;
int[] res = new int[n * m];
if (n == 0) return res;
int x = 0, y = 0;
int nextX, nextY;
boolean up = true;
for (int i = 0; i < n * m; i++) {
res[i] = matrix[x][y];
if (up) {
nextX = x - 1;
nextY = y + 1;
} else {
nextX = x + 1;
nextY = y - 1;
}
if (inArea(nextX, nextY)) {
x = nextX;
y = nextY;
} else if (up) {
if (inArea(x, y + 1))
y++;
else
x++;
up = false;
} else {
if (inArea(x + 1, y))
x++;
else y++;
up = true;
}
// if (!inArea(x, y))
// break;
}
return res;
}
// 判断下一位置是否在数组内
boolean inArea(int x, int y) {
return x >= 0 && x < n && y >= 0 && y < m;
}
}