Given a matrix of M x N elements (M rows, N columns), return all
elements of the matrix in diagonal order as shown in the below image.Example: Input: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] Output:
[1,2,4,7,5,3,6,8,9] Explanation:Note: The total number of elements of the given matrix will not exceed
10,000.
思路
在矩阵遍历的情况下, 一共有两个方向, 右上(i--, j++)和左下(i++, j--)
右上的情况有三个边界条件:
- 碰到上边界
这种情况只需要向右移动一个位置, 然后改变方向为左下 - 遇到右边界
这种情况需要向下移动一个位置, 然后改变方向为左下 - 遇到右上边界
这种情况下和右边界一样, 向下移动一个位置, 改变方向为左下
所以我们可以先判断是否到达右边界, 然后判断是否达到上边界, 这样用两个condition就可以包含这三种情况
左下同样两种情况
- 遇到下边界
- 遇到左边界
- 遇到左下边界
复杂度
O(mn) 空间O(mn)
代码
class Solution {
public int[] findDiagonalOrder(int[][] matrix) {
if (matrix.length == 0) {
return new int[0];
}
int size = matrix[0].length * matrix.length;
int i =0, j =0;
int[] res = new int[size];
boolean flag = true; //true 为右上 false为左下
for (int k = 0; k < size; k++) {
res[k] = matrix[i][j];
if (flag) {//右上走
if (i-1 >= 0 && j+1 < matrix[0].length) {
i--;
j++;
} else if (j + 1 < matrix[0].length) { //遇到右边界, 向下走
j++;
flag = false;
} else if (i+ 1 < matrix.length) {//遇到上边界, 向右
i++;
flag = false;
}
} else {//向左下
if (j - 1 >=0 && i+1 < matrix.length) {
i++;
j--;
} else if (i + 1 < matrix.length) {//遇到下边界,向右
i++;
flag = true;
} else if (j + 1 < matrix[0].length) {//遇到左边界, 向下走
j++;
flag = true;
}
}
}
return res;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。