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代码提交时出现了几次错误。

发布了63 篇原创文章 · 获赞 29 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Hpsyche/article/details/100515209