題目描述
給定一個含有 M x N 個元素的矩陣(M 行,N 列),請以對角線遍歷的順序返回這個矩陣中的所有元素,對角線遍歷如下圖所示。
示例:
輸入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
輸出: [1,2,4,7,5,3,6,8,9]
解釋:
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/diagonal-traverse
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
2. 思路
- 對角線遍歷,那麼我們可以先遍歷所有的正向對角線,即:1;2,4;3,5,7…
- 由題意分析得,當第奇數個對角線遍歷時,其爲反向輸出,我們可以先將其正向遍歷出來,再反轉
- 最後將所有得到的對角線存入結果數組中即可
3. 具體步驟
- 得到二維數組的長度,創建結果數組
int N = matrix.length;//記錄縱座標
int M = matrix[0].length;//記錄橫座標
//聲明結果數組
res = new int[M * N];
- 確定所有對角線的起點座標,進行循環,對角線起點應該爲第一行所有以及最後一列所有
for (int i = 0; i < M + N -1; i++){
//獲得對角線起點橫縱座標
int x = i < M ? 0 : i - M + 1;
int y = i < M ? i : M - 1;
//確定橫縱座標之後,向左下開始遍歷數組
list.addAll(get(matrix, x , y, i));
}
for (int i = 0; i < list.size(); i++){
res[i] = list.get(i);
}
return res;
}
- 將起點座標找到後,正向便利對角線元素,即橫座標向左移動一個單位,縱座標向下移動一個單位
public List<Integer> get(int[][] matrix, int x, int y, int i){
List<Integer> res = new ArrayList<Integer>();
while(true){
//當橫座標小於0或者縱座標大於N後,結束循環
if (y < 0 || x >= matrix.length){
break;
}
//否則在res中記錄當前橫縱座標的數
res.add(matrix[x][y]);
x = x + 1;
y = y - 1;
}
if (i % 2 == 0){
Collections.reverse(res);
}
return res;
}
- 當運行到第奇數個起點時,反轉鏈表,對應到代碼中,i從0開始,所以當i對2取模爲0時,將結果反轉。
- 存儲對角線元素可以使用動態數組存儲,最後將其加在數組中即可
4. 完整代碼
class Solution {
public int[] findDiagonalOrder(int[][] matrix) {
int[] res;
if(matrix == null || matrix.length == 0){
res = new int[0];
return res;
}
int N = matrix.length;//記錄縱座標
int M = matrix[0].length;//記錄橫座標
//聲明結果數組
res = new int[M * N];
List<Integer> list = new ArrayList<Integer>();
//遍歷得到對角線起點
for (int i = 0; i < M + N -1; i++){
//獲得對角線起點橫縱座標
int x = i < M ? 0 : i - M + 1;
int y = i < M ? i : M - 1;
//確定橫縱座標之後,向左下開始遍歷數組
list.addAll(get(matrix, x , y, i));
}
res = list.toArray();
for (int i = 0; i < list.size(); i++){
res[i] = list.get(i);
}
return res;
}
public List<Integer> get(int[][] matrix, int x, int y, int i){
List<Integer> res = new ArrayList<Integer>();
while(true){
//當橫座標小於0或者縱座標大於N後,結束循環
if (y < 0 || x >= matrix.length){
break;
}
//否則在res中記錄當前橫縱座標的數
res.add(matrix[x][y]);
x = x + 1;
y = y - 1;
}
if (i % 2 == 0){
Collections.reverse(res);
}
return res;
}
}