9. <tag-数组模拟矩阵>-lt.498-对角线遍历 + lt.1424-对角线遍历 II 1.2

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

面试扩展: 要求你只使用斜向上45°遍历, 如何实现?

  • 把上面的向上和向下遍历删掉一种情况, 然后每趟遍历前记录本次遍历的初始位置,
  • 遍历完这趟之后, 把行和列直接置为这一趟初始位置的下一行, 或者是这一趟初始位置的下一列即可!
  • 如下图, 笔者画的线表示了每一趟遍历初始位置的变化情况;

在这里插入图片描述

class Solution {
    public int[] findDiagonalOrder(int[][] mat) {
        int rowLen = mat.length;
        int colLen = mat[0].length;

        int[] res = new int[rowLen * colLen];
        int index = 0;

        int count = rowLen + colLen - 1;

        //行数, 列数
        int row = 0;
        int col = 0;

        for(int i = 0; i < count; i++){
            
            //向上遍历
            //if(i % 2 == 0){
                //记录初始位置的row和col
                int cur_row = row;
                int cur_col = col;
                
                while(row >= 0 && col < colLen && row < rowLen){
                
                    res[index++] = mat[row][col];
                    --row;
                    ++col;
                }
				
				// 判断
                if(cur_row < rowLen - 1){
                    row = cur_row + 1;
                    col = cur_col;
                }else{
                    row = rowLen - 1;
                    col = cur_col + 1;
                }

        }
        return res;
    }
}

lt.1424-对角线遍历 II

[案例需求]
在这里插入图片描述

[思路分析]

[代码示例]

posted @   青松城  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示