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; } };
但还是觉得这种方法很笨