列表

详情


NC201. 对角线遍历矩阵

描述

给定一个大小为 n*m 的矩阵,请以对角线遍历并返回遍历结果

数据范围: ,矩阵中的元素满足

示例1

输入:

[[1,2,3],[4,5,6],[7,8,9]]

输出:

[1,2,4,7,5,3,6,8,9]

示例2

输入:

[[1,3],[2,4]]

输出:

[1,3,2,4]

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 6ms, 内存消耗: 1192KB, 提交时间: 2022-02-10

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param mat int整型vector<vector<>> 
     * @return int整型vector
     */
    vector<int> diagonalOrder(vector<vector<int> >& mat)
    {
        int m = mat.size();
        int n = mat[0].size();
       
        vector<int> ret;
        int topRight_x = 0, topRight_y = 0; //沿着最上顶行朝右走,直至碰到最右列
        int downLeft_x = 0, downLeft_y = 0; //沿着最左顶列朝下走,直至碰到最下行
        
        bool starFromUP = false;
        ret.push_back(mat[0][0]);
        while(topRight_y < n && topRight_x < m && downLeft_y < n &&downLeft_x < m)
        {
            if(topRight_y + 1 < n)
                ++topRight_y;
            else
                ++topRight_x;
            
            if(downLeft_x + 1 < m)
                ++downLeft_x;
            else
                ++downLeft_y;
            
            starFromUP = !starFromUP;
            appendElement(starFromUP, mat, ret, topRight_x, topRight_y, downLeft_x, downLeft_y);
        }
        
        return ret;
    }
    
    void appendElement(bool starFromUP, vector<vector<int>> &mat, vector<int> &ret, int x1, int y1, int x2, int y2)
    {
        if(starFromUP)
        {
            while(x1 <= x2)
                ret.push_back(mat[x1++][y1--]);
        }
        else
        {
            while(y2 <= y1)
                ret.push_back(mat[x2--][y2++]);
        }
    }
};

C++ 解法, 执行用时: 7ms, 内存消耗: 1188KB, 提交时间: 2022-01-24

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param mat int整型vector<vector<>> 
     * @return int整型vector
     */
    vector<int> diagonalOrder(vector<vector<int> >& mat) {
        // write code here
        vector<int> res;
        if(mat.size()==0) return res;
        if(mat.size()==1) {//当mat长度为1,说明mat里面只有一个数组
            for(int i=0;i!=mat[0].size();++i) res.push_back(mat[0][i]);
            return res;
        }
        if(mat[0].size()==1) {//当mat[0]长度为1,说明只有1列
            for(int i=0;i!=mat.size();++i) res.push_back(mat[i][0]);
            return res;
        }
        int m=mat.size()-1;
        int n=mat[0].size()-1;
        res.push_back(mat[0][0]);
        int i=0,j=1;
        while(i<=m||j<=n) {//退出循环条件是当i=m&&j=n
            //当i=0或j=n且(i+j)是奇数时,斜向下遍历直到j=0或i=m
            if(((i==0||j==n)&&(i+j)&1)){
                if(i==m&&j==n) {res.push_back(mat[i][j]);break;}
                while(j>0&&i<m) res.push_back(mat[i][j]),++i,--j;
            }
            //当i=0或j=n且(i+j)是偶数时,如果j<n,直接++j;否则++i
            else if((i==0||j==n)&&(i+j)%2==0){
                if(i==m&&j==n) {res.push_back(mat[i][j]);break;}
                if(j<n) res.push_back(mat[i][j]),++j;
                else res.push_back(mat[i][j]),++i;
            }
            //当j=0或i=m且(i+j)是奇数时,如果i<m,++i;否则++j
            if((j==0||i==m)&&(i+j)&1) {
                if(i==m&&j==n) {res.push_back(mat[i][j]);break;}
                if(i<m) res.push_back(mat[i][j]),++i;
                else res.push_back(mat[i][j]),++j;
            } 
            //当j=0或i=m且(i+j)是偶数时,斜向上遍历直到i=0或j=n
            else if((j==0||i==m)&&(i+j)%2==0){
                if(i==m&&j==n) {res.push_back(mat[i][j]);break;}
                while(i>0&&j<n) res.push_back(mat[i][j]),--i,++j;
            }
        }
        return res;
    }
};

C++ 解法, 执行用时: 7ms, 内存消耗: 1200KB, 提交时间: 2022-01-18

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param mat int整型vector<vector<>> 
     * @return int整型vector
     */
    vector<int> diagonalOrder(vector<vector<int> >& mat) {
        // write code here
        vector<int> result;
        int rows=mat.size();
        int cols=mat[0].size();
        result.reserve(rows*cols);
        int i=0;
        int j=0;
        int pos=0;
        while(i<rows&&j<cols)
        {
            result.push_back(mat[i][j]);
            int x=i;
            int y=j;
            for(int k=0;k<3;++k)
            {
                i=x+dx[pos][k];
                j=y+dy[pos][k];
                if(i>=0&&j>=0&&i<rows&&j<cols)
                {
                    if(k>0)
                        pos^=1;
                    break;
                }
            }
        }
        return result;
    }
    private:
    const int dx[2][3]={{-1,0,1},{1,1,0}};
    const int dy[2][3]={{1,1,0},{-1,0,1}};
};

C++ 解法, 执行用时: 7ms, 内存消耗: 1280KB, 提交时间: 2021-12-08

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param mat int整型vector<vector<>> 
     * @return int整型vector
     */
    vector<int> diagonalOrder(vector<vector<int> >& mat) {
        vector<int> result;
        int rows=mat.size();
        int cols=mat[0].size();
        result.reserve(rows*cols);
        int i=0;
        int j=0;
        int pos=0;
        while(i<rows && j<cols) {
            result.push_back(mat[i][j]);
            int x=i;
            int y=j;
            for(int k=0;k<3;++k) {
                i=x+dx[pos][k];
                j=y+dy[pos][k];
                if(i>=0 && j>=0 && i<rows && j<cols) {
                    if(k>0) pos^=1;
                    break;
                }
            }
        }
        
        return result;
    }
    
private:
    const int dx[2][3]={{-1,0,1}, {1,1,0}};
    const int dy[2][3]={{1,1,0}, {-1,0,1}};
};

C++ 解法, 执行用时: 7ms, 内存消耗: 1288KB, 提交时间: 2022-03-14

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;
    }
};

上一题