地址:https://leetcode-cn.com/explore/learn/card/array-and-string/199/introduction-to-2d-array/774/
对角线遍历
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:
输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,4,7,5,3,6,8,9] 解释:
别人的解法:
class Solution {
public int[] findDiagonalOrder(int[][] matrix) {
//考虑边界 []
if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
return new int[0];
}
//m行 n列
int m = matrix.length;
int n = matrix[0].length;
//用来记录加入到结果数组的元素的下标
int count = 0;
//用来保存结果的数组 大小为矩阵的元素个数
int [] result = new int[m*n];
for(int i = 0; i < m+n-1 ; i++){
//i为0或偶数时 沿对角线向上遍历
if( i==0 || i%2 ==0){
//发现规律x+y = i 然后找边界(x坐标超过主对角线时的情况)
int x = i < m? i : m-1 ;
int y = i-x;
//开始遍历 x坐标不断减 y坐标不断加 当x减到0 或者 y加到列n的值
while(x >= 0 && y < n){
result[count] = matrix[x][y];
x--;
y++;
count++;
}
}else{
//沿对角线向下遍历
int y = i < n? i : n -1 ;
int x = i-y;
//y坐标不断减 x坐标不断加 当y减到0 或者 x加到行m的值
while(y >= 0 && x < m){
result[count] = matrix[x][y];
y--;
x++;
count++;
}
}
}
return result;
}
}
作者:kevinallen
链接:https://leetcode-cn.com/problems/diagonal-traverse/solution/dui-jiao-xian-bian-li-xiao-bai-jie-fa-yi-ci-forxun/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
参考上面这个解法的自己的解法:
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
if (matrix.empty() || matrix[0].empty()) return {}; //不加这句会报错
int m = matrix.size();
int n = matrix[0].size();
vector<int> result;
//遍历前m个对角线
for(int i =0;i<m+n-1;i++)
{
vector<int> tmp;//存放每一个对角线提取值
for(int x=i<m?i:m-1,y=i-x;x>=0&&y<n;x--,y++)
{
tmp.push_back(matrix[x][y]);
}
if (i%2!=0)//奇数取逆序
{
reverse(tmp.begin(),tmp.end());
}
result.insert(result.end(),tmp.begin(),tmp.end());
}
// //遍历后n-1个对角线
// for(int i=m;i<n+m-1;i++)
// {
// vector<int> tmp;//存放每一个对角线提取值
// for(int x=m-1,y=i-x;x>=0&&y<n;x--,y++)
// {
// tmp.push_back(matrix[x][y]);
// }
// if (i%2!=0)//奇数取逆序
// {
// reverse(tmp.begin(),tmp.end());
// }
// result.insert(result.end(),tmp.begin(),tmp.end());
// }
return result;
}
};
参考: