Leetcode: 对角线遍历

给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。

思路:找规律,对角线遍历可以发现,一条线上横纵坐标之和是相等的,并且和的最大值为横列数相关(for循环遍历),右上或者左下遍历过程中,可以发现为横坐标或者纵坐标为单增序列(设计个sign判断),只不过需要约束起始点和上限(if 判断语句)

!!!提示:矩阵不一定是方针,所以考虑的时候不能只考虑方阵(我就天真以为啦!!!)

#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
        int coordinata_sum = mat.size() + mat[0].size() - 2;
        int sign = 0;
        vector<int> result;
        result.push_back(mat[0][0]);

        for (int i = 1; i <= coordinata_sum; i++){
            if (sign == 0){
                for (int row_num = 0; row_num <= mat.size()-1; row_num++){
                    if ((i - row_num) < mat[0].size()){
                        result.push_back(mat[row_num][i-row_num]);
                    }
                }
                sign = 1; // change the sign
            }
            else{
                for (int col_num = 0; col_num <= mat[0].size()-1; col_num++){
                    if ((i - col_num) < mat.size()){
                        result.push_back(mat[i-col_num][col_num]);
                    }
                }
                sign = 0; // change the sign
            }
        }
        return result;
    }
};

int main(){
    // vector<vector<int>> mat = {{1,2,3},{4,5,6},{7,8,9}};
    vector<vector<int>> mat = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
    // vector<vector<int>> mat = {{2,3}};
    Solution s;
    vector<int> result = s.findDiagonalOrder(mat);
    for (int i = 0; i < result.size(); i++){
        cout << result[i] << " ";
    }
    return 0;
}

  • 26
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值