498. Diagonal Traverse

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:code

Note: The total number of elements of the given matrix will not exceed
10,000.element

思路

在矩陣遍歷的狀況下, 一共有兩個方向, 右上(i--, j++)和左下(i++, j--)
右上的狀況有三個邊界條件:it

  1. 碰到上邊界
    這種狀況只須要向右移動一個位置, 而後改變方向爲左下
  2. 遇到右邊界
    這種狀況須要向下移動一個位置, 而後改變方向爲左下
  3. 遇到右上邊界
    這種狀況下和右邊界同樣, 向下移動一個位置, 改變方向爲左下

因此咱們能夠先判斷是否到達右邊界, 而後判斷是否達到上邊界, 這樣用兩個condition就能夠包含這三種狀況io

左下一樣兩種狀況class

  1. 遇到下邊界
  2. 遇到左邊界
  3. 遇到左下邊界

複雜度

O(mn) 空間O(mn)遍歷

代碼

class Solution {
    public int[] findDiagonalOrder(int[][] matrix) {
        if (matrix.length == 0) {
            return new int[0];
        }
        int size = matrix[0].length * matrix.length;
        int i =0, j =0;
        int[] res = new int[size];
        boolean flag = true; //true 爲右上 false爲左下
        for (int k = 0; k < size; k++) {
            res[k] = matrix[i][j];
            if (flag) {//右上走
                if (i-1 >= 0 && j+1 < matrix[0].length) {
                    i--;
                    j++;
                } else if (j + 1 < matrix[0].length) { //遇到右邊界, 向下走
                    j++;
                    flag = false;
                } else if (i+ 1 < matrix.length) {//遇到上邊界, 向右
                    i++;
                    flag = false;
                }
            } else {//向左下
                if (j - 1 >=0 && i+1 < matrix.length) {
                    i++;
                    j--;
                } else if (i + 1 < matrix.length) {//遇到下邊界,向右
                    i++;
                    flag = true;
                } else if (j + 1 < matrix[0].length) {//遇到左邊界, 向下走
                    j++;
                    flag = true;
                }
            }
        }
        return res;
    }
}
相關文章
相關標籤/搜索