题意:
给定一个大小为 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;
}
}
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号