热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

给定矩阵左上第Kth条对角线

给定矩阵左上第Kth条对角线原文:https://www.

给定矩阵左上第 Kth 条对角线

原文:https://www . geeksforgeeks . org/kth-从给定矩阵的左上角开始对角化/

给定一个 N * N 维度的平方矩阵 M[ ][ ] ,任务是找到矩阵的 K 条对角线,从左上角开始向右下角移动,并打印其内容。
示例:

输入: N = 3,K = 2,M[ ][ ] = {{4,7,8},{9,2,3},{0,4,1}
输出: 9 7
说明:
给定矩阵从左上角到右下角的 5 条可能对角线为:
1 - > {4}
2 - > {9,7}
3 - >
输入: N = 2,K = 2,M[ ][ ] = {1,5},{9,4}}
输出: 1
解释:
对于给定矩阵,从左下到右上开始的 3 种可能对角线为:
1 - > {1}
2 - > {9,5}
3 - > {4}

天真方法:
解决这个问题最简单的方法是从给定矩阵的左上角到右下角生成所有对角线。生成第 K 对角线后,打印其内容。
时间复杂度:O(N2)
辅助空间: O(N)
高效途径:
以上途径可以通过避免遍历矩阵来优化。相反,找到 K 对角线的边界,即左下和右上索引。获得这些索引后,只需遍历对角线的索引即可打印所需的对角线。
需要以下观察来找到对角线的位置:

如果((K–1):对角线为上对角线
左下边界=M【K–1】【0】
右上边界=M【0】【K–1】
如果 (K?N) :对角线为下对角线。
左下边界= M[N-1][K-N]
右上边界= M[K-N][N-1]

按照以下步骤解决问题:


  • 如果(K–1)<N,设置起始行,起始行K–1,列,起始列0

  • 否则,将 startRow 设置为N–1startCol 设置为K–N

  • 最后从M【startRow】【startCol】开始打印对角线的元素。

以下是上述方法的实现:

C++

// C++ implementation of
// the above approach
#include
using namespace std;
// Function returns required diagonal
void printDiagonal(int K, int N,
                vector >& M)
{
    int startrow, startcol;
    // Initialize values to
    // print upper diagonals
    if (K - 1         startrow = K - 1;
        startcol = 0;
    }
    // Initialize values to
    // print lower diagonals
    else {
        startrow = N - 1;
        startcol = K - N;
    }
    // Traverse the diagonal
    for (; startrow >= 0 && startcol         startrow--, startcol++) {
        // Print its contents
        cout <            <<" ";
    }
}
// Driver Code
int main()
{
    int N = 3, K = 4;
    vector > M = { { 4, 7, 8 },
                            { 9, 2, 3 },
                            { 0, 4, 1 } };
    printDiagonal(K, N, M);
    return 0;
}

Java 语言(一种计算机语言,尤用于创建网站)

// Java implementation of
// the above approach
import java.util.*;
class GFG{
// Function returns required diagonal
static void printDiagonal(int K, int N,
                          int [][]M)
{
    int startrow, startcol;
    // Initialize values to
    // print upper diagonals
    if (K - 1     {
        startrow = K - 1;
        startcol = 0;
    }
    // Initialize values to
    // print lower diagonals
    else
    {
        startrow = N - 1;
        startcol = K - N;
    }
    // Traverse the diagonal
    for(; startrow >= 0 && startcol           startrow--, startcol++)
    {
        // Print its contents
        System.out.print(M[startrow][startcol] + " ");
    }
}
// Driver Code
public static void main(String[] args)
{
    int N = 3, K = 4;
    int[][] M = { { 4, 7, 8 },
                  { 9, 2, 3 },
                  { 0, 4, 1 } };
    printDiagonal(K, N, M);
}
}
// This code is contributed by PrinciRaj1992

Python 3

# Python3 implementation of the
# above approach
def printDiagonal(K, N, M):
    startrow, startcol = 0, 0
    # Initialize values to prupper
    # diagonals
    if K - 1         startrow = K - 1
        startcol = 0
    else:
        startrow = N - 1
        startcol = K - N
    # Traverse the diagonals
    while startrow >= 0 and startcol         # Print its contents
        print(M[startrow][startcol], end = " ")
        startrow -= 1
        startcol += 1
# Driver code
if __name__ == '__main__':
    N, K = 3, 4
    M = [ [ 4, 7, 8 ],
          [ 9, 2, 3 ],
          [ 0, 4, 1 ] ]
    printDiagonal(K, N, M)
# This code is contributed by mohit kumar 29

C

// C# implementation of
// the above approach
using System;
class GFG{
// Function returns required diagonal
static void printDiagonal(int K, int N,
                          int [,]M)
{
    int startrow, startcol;
    // Initialize values to
    // print upper diagonals
    if (K - 1     {
        startrow = K - 1;
        startcol = 0;
    }
    // Initialize values to
    // print lower diagonals
    else
    {
        startrow = N - 1;
        startcol = K - N;
    }
    // Traverse the diagonal
    for(; startrow >= 0 && startcol           startrow--, startcol++)
    {
        // Print its contents
        Console.Write(M[startrow,startcol] + " ");
    }
}
// Driver Code
public static void Main(String[] args)
{
    int N = 3, K = 4;
    int[,] M = { { 4, 7, 8 },
                 { 9, 2, 3 },
                 { 0, 4, 1 } };
    printDiagonal(K, N, M);
}
}
// This code is contributed by PrinciRaj1992

java 描述语言


输出:

4 3

时间复杂度: O(N)
辅助空间: O(1)


推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 无损压缩算法专题——LZSS算法实现
    本文介绍了基于无损压缩算法专题的LZSS算法实现。通过Python和C两种语言的代码实现了对任意文件的压缩和解压功能。详细介绍了LZSS算法的原理和实现过程,以及代码中的注释。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
author-avatar
挖掘机销售mv
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有