遍歷對角線——力扣498

題目描述

給定一個含有 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. 對角線遍歷,那麼我們可以先遍歷所有的正向對角線,即:1;2,4;3,5,7…
  2. 由題意分析得,當第奇數個對角線遍歷時,其爲反向輸出,我們可以先將其正向遍歷出來,再反轉
  3. 最後將所有得到的對角線存入結果數組中即可

3. 具體步驟

  1. 得到二維數組的長度,創建結果數組
 int N = matrix.length;//記錄縱座標
        int M = matrix[0].length;//記錄橫座標
        //聲明結果數組
        res = new int[M * N];
  1. 確定所有對角線的起點座標,進行循環,對角線起點應該爲第一行所有以及最後一列所有
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;
    }
  1. 將起點座標找到後,正向便利對角線元素,即橫座標向左移動一個單位,縱座標向下移動一個單位
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;
    }
  1. 當運行到第奇數個起點時,反轉鏈表,對應到代碼中,i從0開始,所以當i對2取模爲0時,將結果反轉。
  2. 存儲對角線元素可以使用動態數組存儲,最後將其加在數組中即可

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;
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章