498. Diagonal Traverse對角線z型traverse
阿新 • • 發佈:2018-08-12
分析 tps res com and drive 再處理 fun 遞歸
[抄題]:
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:
[暴力解法]:
時間分析:
空間分析:
[優化後]:
時間分析:
空間分析:
[奇葩輸出條件]:
[奇葩corner case]:
[思維問題]:
不知道怎麽控制方向:由於每次只走一格,所以用xy+-d即可,d=1
[英文數據結構或算法,為什麽不用別的數據結構或算法]:
[一句話思路]:
[輸入量]:空: 正常情況:特大:特小:程序裏處理到的特殊情況:異常情況(不合法不合理的輸入):
[畫圖]:
[一刷]:
- 為了保證第一個數一樣,都是先直接添加後再處理
result[i] = matrix[row][col];
row -= d;
col += d;
[二刷]:
- 為了避免處理>邊界時順便把<邊界處理了,<邊界的小情況要寫在後面
[三刷]:
[四刷]:
[五刷]:
[五分鐘肉眼debug的結果]:
[總結]:
換方向用d = -d來控制
[復雜度]:Time complexity: O(n) Space complexity: O(n)
[算法思想:叠代/遞歸/分治/貪心]:
[關鍵模板化代碼]:
[其他解法]:
[Follow Up]:
[LC給出的題目變變變]:
[代碼風格] :
[是否頭一次寫此類driver funcion的代碼] :
[潛臺詞] :
public class Solution { public int[] findDiagonalOrder(int[][] matrix) { ifView Code(matrix == null || matrix.length == 0) return new int[0]; int m = matrix.length, n = matrix[0].length; int[] result = new int[m * n]; int row = 0, col = 0, d = 1; //for loop: add to result, expand, handle corner cases for (int i = 0; i < m * n; i++) { result[i] = matrix[row][col]; row -= d; col += d; if (row >= m) {row = m - 1; col += 2; d = -d;} if (col >= n) {col = n - 1; row += 2; d = -d;} if (row < 0) {row = 0; d = -d;} if (col < 0) {col = 0; d = -d;} } return result; } }
498. Diagonal Traverse對角線z型traverse