uacs2024

导航

leetcode498-对角线遍历

 

 

https://leetcode.cn/problems/diagonal-traverse/

一开始看到题目的想法是,每个矩阵都要用for循环遍历m+n-1次对角线,然后遍历对角线上的元素,后来感觉太麻烦便放弃。

然后就想到通过一个bool类型的变量控制遍历方向是从右上还是左下,true代表右上,false代表左下。

讲遍历得到的元素插入到vector数组的尾部,当vector的大小仍小于矩阵元素数量时第一层循环一直进行下去。

  当数组下标没有出界时,将此时的元素插入到vector。通过flag判断应该往右上还是左下移动。

  出界,若是行下标 i 上面出界,再判断此时是否为矩阵为(-1,n),若是则说明下一条对角线遍历的第一个元素为(1,n-1)

                                若不是则说明下一条对角线遍历的第一个元素为(0,j)

     若是行下标 i 下面出界,说明下一条对角线遍历的第一个元素为(m-1,j+2)

     j 下标出界同理。

class Solution {
public:
    vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
        vector<int> res;
        int m=mat.size(),n=mat[0].size(),i=0,j=0,mn=m*n;
        bool flag=true;    
        while(res.size()<mn)
        {
            //printf("xunhuan\n");
            while(i!=-1&&i!=m&&j!=-1&&j!=n)
            {
                res.push_back(mat[i][j]);
                //printf("[%d] ",mat[i][j]);
                if(flag)  //通过flag判断应该往右上还是左下移动。true代表右上,false代表左下。
                {
                    i--;j++;
                }
                else
                {
                    i++;j--;
                }
            }
            flag = flag?false:true;
            if(i==-1)
            {
if(j!=n) i++;
                else
                {
                    i+=2;j--;
                }
                //printf("%d %d 第一\n",i,j);
                continue;
            }
            if(i==m)
            {
                i--;j+=2;
                //printf("%d %d 第三\n",i,j);
                continue;
            }
            if(j==-1)
            {
                if(i!=m) j++;
                else
                {
                    j+=2;i--;
                }
                //printf("%d %d 第二\n",i,j);
                continue;
            }
            if(j==n)
            {
                i+=2;j--;
                //printf("%d %d 第四\n",i,j);
                continue;
            }
        }
        return res;
    }
};

 

 但还是觉得这种方法很笨

 

posted on 2022-09-08 19:55  ᶜʸᵃⁿ  阅读(20)  评论(0编辑  收藏  举报