题意:
给定一个大小为 n*m 的矩阵,请以对角线遍历并返回遍历结果。
方法一:
模拟
思路:模拟。
规律如下:
1、n行m列的矩阵对角线遍历的行数为(n+m-1)行;
2、每一行的元素:行下标+列下标=行号,即(i+j==行号);
3、前n行的列下标都是从 j=0 开始,后面行的列下标开始符号分别是 j=1, j=2, j=3.......连续递增。
可以每次都斜向上遍历每行的元素,然后再把奇数行的元素翻转即可(行下标从0开始)。
class Solution { public: vector<int> diagonalOrder(vector<vector<int>>& mat) { vector<int> res; vector<int> t;//临时数组 if(mat.size()==0) return res; int n=mat.size(),m=mat[0].size(); int flag=1;//-1表示斜向上,1表示斜向下 int i=0; for(;i<n;i++){//遍历前n行 flag=-flag; for(int j=0;j<m&&j<=i;j++){//遍历行中元素 t.push_back(mat[i-j][j]); } if(flag==1) reverse(t.begin(),t.end()); for(int j=0;j<t.size();j++) res.push_back(t[j]); t.clear(); } int tmp=0; for(;i<n+m-1;i++){//遍历后面的行 flag=-flag; for(int j=++tmp;j<tmp+n&&j<m;j++){//遍历行中元素 t.push_back(mat[i-j][j]); } if(flag==1) reverse(t.begin(),t.end()); for(int j=0;j<t.size();j++) res.push_back(t[j]); t.clear(); } return res; } };
时间复杂度:空间复杂度:
方法二:
java
思路:思路与方法一相同,模拟实现。
import java.util.*; public class Solution { public int[] diagonalOrder (int[][] mat) { if(mat.length==0) return new int[0]; int n=mat.length,m=mat[0].length; int[] res=new int[n*m]; Vector<Integer> t=new Vector<>();//临时数组 int k=0; int flag=1;//-1表示斜向上,1表示斜向下 int i=0; for(;i<n;i++){//遍历前n行 flag=-flag; for(int j=0;j<m&&j<=i;j++){//遍历行中元素 t.add(mat[i-j][j]); } if(flag==1) Collections.reverse(t); for(int j=0;j<t.size();j++) res[k++]=t.get(j); t.clear(); } int tmp=0; for(;i<n+m-1;i++){//遍历后面的行 flag=-flag; for(int j=++tmp;j<tmp+n&&j<m;j++){//遍历行中元素 t.add(mat[i-j][j]); } if(flag==1) Collections.reverse(t); for(int j=0;j<t.size();j++) res[k++]=t.get(j); t.clear(); } return res; } }
时间复杂度:空间复杂度: