9. <tag-数组模拟矩阵>-lt.498-对角线遍历(待补充)

lt.498-对角线遍历

[案例需求]
在这里插入图片描述
[思路分析]

class Solution {
    
    
    public int[] findDiagonalOrder(int[][] mat) {
    
    
        // 每个矩阵对角线遍历次数为 count = m + n - 1;]
        //在这些遍历中, 先向上遍历, 再向下遍历;
        //注意, 每次遍历到边缘部位, 如果要回到下一个方向遍历的第一个元素, 还要对行数,和列数做出处理
        
        int rowLen = mat.length;
        int colLen = mat[0].length;

        //结果矩阵 和 这个矩阵的索引 resindex
        int[] res = new int[rowLen * colLen];
        int resIndex = 0;
        //遍历次数
        int count = rowLen + colLen - 1;
        int col = 0;
        int row = 0;

        for(int i = 0; i < count; i++){
    
    
            //向上遍历, 也就是count为偶数的时候, 向上遍历
            if(i % 2 ==0){
    
    
                //边界处理很重要
                //下面的while循环是完整的一次向上遍历过程
                while(row >= 0 && col < colLen){
    
    
                    
                    res[resIndex++] = mat[row][col];
                    row--;
                    col++;
                }
                
                //边界处理(向上-->向下遍历转换, 需要做边界处理)要分为两种
                //一种是向上遍历时, 遍历完一个数值后, 行-1, 列 + 1, 此时还未到达矩阵的最后一列(col < colLen)
                //当向上遍历取到了最后一列上的值的时候,  行 + 2, 列 - 1
                if(col < colLen){
    
    
                    row++;
                }else{
    
    
                    row += 2;
                    col--;
                }

            }else{
    
    
                //下面的while循环是一次向下遍历的过程
                while(col >= 0 && row < rowLen){
    
    

                    res[resIndex++] = mat[row][col];
                    row++;
                    col--;
                }

                //向下-->向上遍历的转换
                if(row < rowLen){
    
    
                    col++;
                }else{
    
    
                    
                    row --;
                    col += 2;
                }
            }
        }

        return res;
    }
}

Guess you like

Origin blog.csdn.net/nmsLLCSDN/article/details/121437539