力扣、498: 对角线遍历

 首先看上图可以得出它的遍历顺序,第一趟往右上方向,第二趟往左下方向,第三趟又和第一趟的遍历方向一样为右上,第四趟方向又和第二趟一样为左下方向.........规律以此类推。

 思路理清楚了   下面开始代码填充:

class Solution {
public:
    vector<int> findDiagonalOrder(vector<vector<int>>& mat) 
    {
        vector<int> vec;   //将m*n矩阵中的数组重新排列之后存储在vec中进行返回
        int size = mat.size() * mat[0].size();   //m*n矩阵大小为长乘宽
        int x = 0, y = 0;  //初始化坐标下标为0,0
        for (int i = 0; i < size; ++i)
        {
            vec.push_back(mat[x][y]);
            //右上方向遍历
            if ((x + y) % 2 == 0)
            {
                if (y == mat[0].size() - 1)   //到达了右边界(最后一列)   不进行y++了  因为这样会越界
                {
                    x++;
                }
                else if (x == 0)   //当前遍历元素处于第一行
                {
                    y++;
                }
                else
                {
                    x--;
                    y++;
                }
            }
            //左下方向遍历
            else
            {
                if (x == mat.size() - 1)   //到达了右边界(最后一行)   不进行x++了  因为这样会越界
                {
                    y++;
                }
                else if (y == 0)        当前遍历元素处于第一列
                {
                    x++;
                }
                else
                {
                    x++;
                    y--;
                }
            }
        }
        return vec;
    }
}

总结:在这道题中我们根据对角线遍历的规则,可以按照其二维坐标的变化来分别列出右上遍历和左下遍历的规律 ,再将每次遍历的都存入vector中,最后return返回这个vector就好。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值