問(wèn)題:
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:
image.pngNote:
The total number of elements of the given matrix will not exceed 10,000.
大意:
給出一個(gè)包含 M * N 個(gè)元素的矩陣(M行凝赛,N列)饱岸,按照如下圖所示順序返回矩陣中所有元素允粤。
例子:輸入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
輸出:[1,2,4,7,5,3,6,8,9]
解釋:
image.png注意:
矩陣的元素?cái)?shù)量不會(huì)超過(guò)10000蒂破。
思路:
我們可以跟隨例子中的路線來(lái)遍歷矩陣,路線無(wú)非就是從左下到右上晰骑,到頂后又從右上到坐下布隔,一直到最右下角一個(gè)點(diǎn)趟济。
在往右上的過(guò)程中,一般是行在減送爸,列在加铛嘱,有三種情況停止右上:
- 到了第一行,不能再往上了袭厂;
- 到了最右邊列墨吓,不能再往右了;
- 到了最右下角的元素纹磺,這時(shí)候要全部結(jié)束遍歷帖烘。
往左下的過(guò)程中,一般是行在加橄杨,列在減秘症,有三種情況停止左下:
- 到了第一列,不能在往左了式矫;
- 到了最下邊的行乡摹,不能再往下了;
- 到了最右下角的元素采转,這時(shí)候要全部結(jié)束遍歷趟卸。
我們把這個(gè)過(guò)程用代碼實(shí)現(xiàn)出來(lái)就可以了,用多個(gè) if - else 來(lái)分支處理氏义。
代碼(Java):
public class Solution {
public int[] findDiagonalOrder(int[][] matrix) {
boolean up = true;
if (matrix.length == 0) return new int[0];
int[] res = new int[matrix.length * matrix[0].length];
int i = 0;
int j = 0;
for (int k = 0; k < matrix.length * matrix[0].length; k++) {
res[k] = matrix[i][j];
if (up) {// 往右上走
if ((i-1) >= 0 && (j+1) < matrix[0].length) {
i--;
j++;
} else if ((j+1) < matrix[0].length) {
j++;
up = false;
} else if ((i+1) < matrix.length) {
i++;
up = false;
} else break;
} else {// 往左下走
if ((i+1) < matrix.length && (j-1) >= 0) {
i++;
j--;
} else if ((i+1) < matrix.length) {
i++;
up = true;
} else if ((j+1) < matrix[0].length) {
j++;
up = true;
} else break;
}
}
return res;
}
}
合集:https://github.com/Cloudox/LeetCode-Record