LC 对角线遍历

这篇具有很好参考价值的文章主要介绍了LC 对角线遍历。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LC 对角线遍历

题目描述:

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

题目实例:

示例一:

LC 对角线遍历,Leetcode,算法,leetcode,c++,数据结构

输入:mat = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,4,7,5,3,6,8,9]

示例二:
输入:mat = [[1,2],[3,4]]
输出:[1,2,3,4]

提示:
m == mat.length
n == mat[i].length
1 <= m, n <= 104
1 <= m * n <= 104
-105 <= mat[i][j] <= 105

审题:

本题对空间复杂度无要求,我们可以申请额外的空间来解题。

标准思路:

仔细观察我们发现偶数对角线向上遍历,奇数列向下遍历,所以我们的代码就可以按照这个思路遍历。

(1)先得出遍历的次数,也就是对角线的条数为i=n+m-1,所以数组遍历条件也就是i<n+m-1。
(2)在看图,对角线上的每个元素坐标之和为i,也就是元素的坐标xy与i的关系为:x+y=i
(3)如何遍历?看图中,偶数对应的对角线上的元素是从下往上遍历,而奇数对应的对角线上的元素是从上往下遍历,那么只要确定遍历的起始点和结束点就好啦!我们先看偶数对角线的起点和终点,因为奇数对角线和它相反,知道了偶数的,也不难得出奇数的的。

当i<n-1时,起始点坐标x=i,如1的x坐标为0,i也为0,结束点的横坐标x=0
当i>=n-1时,起始点坐标x=n-1,如2的x坐标为2,i也为2,结束点的纵坐标y=m-1,根据(2)中的关系式,所以得出横坐标x=i-(m-1)
所以偶数对角线遍历时起始点的x的坐标为min(i,n-1),结束点的x坐标为max(0,i-(m-1)),而坐标y就是i-x

LC 对角线遍历,Leetcode,算法,leetcode,c++,数据结构

代码如下:

#include <vector>

using namespace std;

vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
    // 初始化结果数组
    vector<int> result;
    // 获取矩阵的行数和列数
    int m = mat.size();
    if (m == 0) return result;  // 如果矩阵为空,则直接返回空数组
    int n = mat[0].size();

    // 对角线遍历
    for (int i = 0; i < m + n - 1; ++i) {
        if (i % 2 == 0) {  // 从左上到右下
            // 根据当前对角线的位置,确定遍历的起始点和结束点
            int startX = max(0, i - m + 1);
            int endX = min(i, n - 1);
            // 遍历当前对角线上的元素
            for (int x = startX; x <= endX; ++x) {
                result.push_back(mat[i - x][x]);
            }
        } else {  // 从右下到左上
            // 根据当前对角线的位置,确定遍历的起始点和结束点
            int startX = max(0, i - n + 1);
            int endX = min(i, m - 1);
            // 遍历当前对角线上的元素
            for (int x = startX; x <= endX; ++x) {
                result.push_back(mat[x][i - x]);
            }
        }
    }

    // 返回结果数组
    return result;
}

我的解题思路:

我一开始没有看出奇偶数对角线的特点,注意力全放在了如何遍历的方向上了,我发现遍历时只需要对矩阵边界上的数据做处理,矩阵内的数据只要按照上次遍历的方向走就行了,于是我定义了四个bool类型的变量flag来记录上一次遍历的方向,如果是边界上的数据就进行转弯,如果是矩阵内的数据就按照上一次的遍历方向进行就可以了;当然还需要对一些特殊矩阵做出特殊的处理。代码如下:

#include <iostream>
#include <vector>

using namespace std;

vector<int> findDiagonalOrder(vector<vector<int>> &mat)
{
    int row = mat.size();
    int columns = mat[0].size();
    int i = 0, j = 1, r = 1;
    vector<int> answer;
    bool lowerLeft = false, right = false, upperRight = false, down = false;

    answer.resize(row * columns);

    answer[0] = mat[0][0];
    right = true;

    if (row == 1 && columns == 1)
    {
        return answer;
    }
    else if (row == 1 && columns != 1)
    {
        for (; r < columns; ++r)
        {
            answer[r] = mat[0][r];
        }
        return answer;
    }
    else if (row != 1 && columns == 1)
    {
        for (; r < row; ++r)
        {
            answer[r] = mat[r][0];
        }
        return answer;
    }

    while (i < row && j < columns)
    {
        if (i == 0 && j == columns - 1 && upperRight)
        {
            answer[r++] = mat[i][j];
            ++i;
            down = true, upperRight = false;
        }
        else if (i == 0 && j == columns - 1 && right)
        {
            answer[r++] = mat[i][j];
            ++i, --j;
            lowerLeft = true, right = false;
        }
        else if (i == 0 && right)
        {
            answer[r++] = mat[i][j];
            ++i, --j;
            right = false, lowerLeft = true;
        }
        else if (i == 0 && upperRight)
        {
            answer[r++] = mat[i][j];
            ++j;
            upperRight = false, right = true;
        }
        else if (i == row - 1 && lowerLeft)
        {
            answer[r++] = mat[i][j];
            ++j;
            lowerLeft = false, right = true;
        }
        else if (i == row - 1 && right)
        {
            answer[r++] = mat[i][j];
            --i, ++j;
            right = false, upperRight = true;
        }
        else if (j == 0 && lowerLeft)
        {
            answer[r++] = mat[i][j];
            ++i;
            lowerLeft = false, down = true;
        }
        else if (j == 0 && down)
        {
            answer[r++] = mat[i][j];
            --i, ++j;
            down = false, upperRight = true;
        }
        else if (j == columns - 1 && right)
        {
            answer[r++] = mat[i][j];
            ++i, --j;
            right = false, lowerLeft = true;
        }
        else if (j == columns - 1 && upperRight)
        {
            answer[r++] = mat[i][j];
            ++i;
            upperRight = false, down = true;
        }
        else if (j == columns - 1 && down)
        {
            answer[r++] = mat[i][j];
            ++i, --j;
            down = false, lowerLeft = true;
        }
        else if (lowerLeft)
        {
            answer[r++] = mat[i][j];
            ++i, --j;
        }
        else
        {
            answer[r++] = mat[i][j];
            --i, ++j;
        }
    }

    return answer;
}

int main(int argc, char *argv[])
{
    vector<vector<int>> myVector = {{1, 2, 3, 4, 5}};

    /*
    {{1, 2, 3, 4},
                                        {5, 6, 7, 8},
                                        {9, 10, 11, 12},
                                        {13, 14, 15, 16}}

                                        {{1, 2, 3},
                                    {4, 5, 6},
                                    {7, 8, 9}}
    */
    vector<int> answer;

    for (int i = 0; i < myVector.size(); ++i)
    {
        for (int j = 0; j < myVector[0].size(); ++j)
        {
            cout << myVector[i][j] << " ";
        }
        cout << endl;
    }

    answer = findDiagonalOrder(myVector);

    cout << endl;

    for (int i = 0; i < answer.size(); ++i)
    {
        cout << answer[i] << " ";
    }
    cout << endl;
    return 0;
}
运行结果

LC 对角线遍历,Leetcode,算法,leetcode,c++,数据结构文章来源地址https://www.toymoban.com/news/detail-812214.html

到了这里,关于LC 对角线遍历的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ​LeetCode解法汇总1572. 矩阵对角线元素的和

    https://github.com/September26/java-algorithms 给你一个正方形矩阵  mat ,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例  1:   示例  2: 示例 3: 提示: n == mat.length == mat[i].length 1 = n = 100 1 = mat[i][j] = 100  

    2024年02月13日
    浏览(21)
  • 【LeetCode每日一题】——1572.矩阵对角线元素的和

    矩阵 简单 1572.矩阵对角线元素的和 给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1: 输入:mat = [[1,2,3],                      [4,5,6],                      [7,

    2024年02月14日
    浏览(34)
  • LeetCode_03Java_1572. 矩阵对角线元素的和

    给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例二 示例三 代码实现

    2024年02月13日
    浏览(21)
  • 【每日一题Day292】LC1572矩阵对角线元素的和 模拟

    思路 简单模拟,主对角线的元素横纵坐标相等,副对角线的元素横纵坐标相加为n-1,注意避免重复计算 实现 复杂度 时间复杂度: O ( log ⁡ n ) mathcal{O}(log n) O ( lo g n ) 空间复杂度: O ( 1 ) mathcal{O}(1) O ( 1 )

    2024年02月13日
    浏览(28)
  • 用对角线去遍历矩阵

    声明 该系列文章仅仅展示个人的解题思路和分析过程,并非一定是优质题解,重要的是通过分析和解决问题能让我们逐渐熟练和成长,从新手到大佬离不开一个磨练的过程,加油! 原题链接 用对角线遍历矩阵 https://leetcode.cn/leetbook/read/array-and-string/cuxq3/ 算法分析 图一 图二

    2024年02月13日
    浏览(23)
  • C#八皇后算法:回溯法 vs 列优先法 vs 行优先法 vs 对角线优先法

    目录 1.八皇后算法(Eight Queens Puzzle) 2.常见的八皇后算法解决方案 (1)列优先法(Column-First Method): (2)行优先法(Row-First Method): (3)对角线优先法(Diagonal-First Method): (4)回溯法(Backtracking):        皇后问题是一个古老而著名的问题,它实质上就是使棋

    2024年03月22日
    浏览(28)
  • C语言程序设计:求矩阵主对角线和副对角线元素之和

    题目内容: 求5行5列矩阵的主对角线和副对角线元素之和。 输入格式: \\\"%d\\\" 输出格式: \\\"sum=%d\\\" 输入样例: 1 2 3 4 3 2 3 4 1 6 3 4 5 6 7 4 2 6 7 8 1 6 7 8 9 输出样例: sum=37 时间限制:500ms内存限制:32000kb

    2024年02月13日
    浏览(47)
  • 输入一个n×n的矩阵,分别计算该矩阵主对角线元素与副对角线元素之和。

    输入格式: 输入包含n + 1行: 第一行为一个正整数n(1 = n = 10)。 第二行到第n + 1行,每行有n个整数,邻近两数之间用一个空格隔开。 输出格式: 两数之间用一个空格隔开。 输入样例: 4 2 3 4 1 5 6 2 1 7 1 8 3 1 6 1 1 输出样例: 17 5

    2024年02月11日
    浏览(37)
  • 矩阵对角线

      在一个二维的数字矩阵中,从左上角至右下角的对角线为主对角线,从右上角至左下角的对角线为次对角线,如下图所示。 已知一个 n×n 的数字矩阵,请你输出矩阵主,次对角线上的元素。 输入格式 一行一个整数 n。 接下来的 n 行每行 n 个整数 aij​,表示矩阵元素

    2024年02月16日
    浏览(30)
  • 矩阵对角线元素求和

    输入一个5×5的数组,分别求其主对角线和辅对角线上元素之和。 输入: 5×5的数组 输出: 主对角线和辅对角线上元素之和 输入样例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 输出样例: 65 65 提示: 主对角线为从矩阵的左上角至右下角的连线,在数组中即指行列下

    2024年02月04日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包