leetcode——對角線遍歷(之字形遍歷二維數組)

引入

本題可見leetcode第498
給定一個含有 M x N 個元素的矩陣(M 行,N 列),請以對角線遍歷的順序返回這個矩陣中的所有元素,對角線遍歷如下圖所示。

示例

輸入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
輸出: [1,2,4,7,5,3,6,8,9]

思路

其主要思路爲,將大問題拆解爲一個個“通過起始位置和終止位置輸出對角線”的結果的集合,同時由於之字形存在着“左上–》右下”和“右上–》左下”兩種情況,需要引入一個boolean變量在加以判斷。

代碼

import com.hpsyche.sort.utils.SortUtils;

import javax.xml.bind.SchemaOutputResolver;
import java.sql.SQLOutput;

/**
 * @author Hpsyche
 */
public class FindDiagonalOrder {
    public int[] findDiagonalOrder(int[][] matrix) {
        if (matrix == null) {
            return null;
        }
        if(matrix.length==0){
            return new int[]{};
        }
        int[] arr = new int[matrix.length * matrix[0].length];
        findMethod(matrix, arr);
        return arr;
    }

    private void findMethod(int[][] matrix, int[] arr) {
        int height = matrix.length - 1;
        int width = matrix[0].length - 1;
        int count = 0;
        int currBeginX = 0;
        int currBeginY = 0;
        int currEndX = 0;
        int currEndY = 0;
        boolean flag=false;
        while (count < arr.length - 1) {
            count = findDiagonal(matrix, arr, count, currBeginX, currBeginY, currEndX, currEndY, flag);
            flag=!flag;
            if(currBeginY<width){
                 currBeginY++;
            }
            else if(currBeginY==width){
                currBeginX++;
            }
            if(currEndX<height){
                currEndX++;
            }
            else if(currEndX==height){
                currEndY++;
            }
        }
        arr[count]=matrix[height][width];
    }

    private int findDiagonal(int[][] matrix, int[] arr, int count, int beginX, int beginY, int endX, int endY, boolean flag) {
        int currX;
        int currY;
        if (flag) {
            currX = beginX;
            currY = beginY;
            while (currX <= endX && currY >= endY) {
                arr[count] = matrix[currX][currY];
                count++;
                currX++;
                currY--;
            }
        }
        if (!flag) {
            currX = endX;
            currY = endY;
            while (currX >= beginX && currY <= beginY) {
                arr[count] = matrix[currX][currY];
                count++;
                currY++;
                currX--;
            }
        }
        return count;
    }
}

思路其實比較簡單,但自己在邊界的思考和處理上還是做得不夠,導致leetcode代碼提交時出現了幾次錯誤。

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