1. 程式人生 > >498. Diagonal Traverse對角線z型traverse

498. Diagonal Traverse對角線z型traverse

分析 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

[英文數據結構或算法,為什麽不用別的數據結構或算法]:

[一句話思路]:

[輸入量]:空: 正常情況:特大:特小:程序裏處理到的特殊情況:異常情況(不合法不合理的輸入):

[畫圖]:

[一刷]:

  1. 為了保證第一個數一樣,都是先直接添加後再處理

result[i] = matrix[row][col];
row -= d;
col += d;

[二刷]:

  1. 為了避免處理>邊界時順便把<邊界處理了,<邊界的小情況要寫在後面

[三刷]:

[四刷]:

[五刷]:

[五分鐘肉眼debug的結果]:

[總結]:

換方向用d = -d來控制

[復雜度]:Time complexity: O(n) Space complexity: O(n)

[算法思想:叠代/遞歸/分治/貪心]:

[關鍵模板化代碼]:

[其他解法]:

[Follow Up]:

[LC給出的題目變變變]:

[代碼風格] :

[是否頭一次寫此類driver funcion的代碼] :

[潛臺詞] :

技術分享圖片
public class Solution {
    public int[] findDiagonalOrder(int[][] matrix) {
        if
(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; } }
View Code

498. Diagonal Traverse對角線z型traverse