首页 > 其他分享 >2679. 矩阵中的和

2679. 矩阵中的和

时间:2023-07-07 17:22:52浏览次数:29  
标签:nums int MAX MAX1 矩阵 sum1 循环 2679

给你一个下标从 0 开始的二维整数数组 nums 。一开始你的分数为 0 。你需要执行以下操作直到矩阵变为空:

矩阵中每一行选取最大的一个数,并删除它。如果一行中有多个最大的数,选择任意一个并删除。
在步骤 1 删除的所有数字中找到最大的一个数字,将它添加到你的 分数 中。
请你返回最后的 分数 。

示例 1:

输入:nums = [[7,2,1],[6,4,2],[6,5,3],[3,2,1]]
输出:15
解释:第一步操作中,我们删除 7 ,6 ,6 和 3 ,将分数增加 7 。下一步操作中,删除 2 ,4 ,5 和 2 ,将分数增加 5 。最后删除 1 ,2 ,3 和 1 ,将分数增加 3 。所以总得分为 7 + 5 + 3 = 15 。
示例 2:

输入:nums = [[1]]
输出:1
解释:我们删除 1 并将分数增加 1 ,所以返回 1 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sum-in-a-matrix/

第一次执行代码

int matrixSum(int** nums, int numsSize, int* numsColSize){

    int MAX[numsSize][2];
    int MAX1;
    int sum=0;
    int sum1;
    int i,j;
    while(sum1!=0){
    for (i=0;i<numsSize;i++){
        sum1 = 0;
        MAX[i][0]=0; //num
        MAX[i][1]=0; //location
        for(j=0;j<numsSize;j++){
            if(nums[i][j]>MAX[i][0]){
                MAX[i][0]=nums[i][j];
                MAX[i][1]=j;
            }
            sum1 = sum1 + nums[i][j];
        }
        nums[i][MAX[i][1]]=0;
        if (MAX1<MAX[i][0])
        MAX1 = MAX[i][0];
    }
    sum = sum + MAX1;
    }
return sum;
}

代码逻辑为
使用MAX[i][0]记录每一次遍历完每一行矩阵之后获取到的最大值,在每一次更新最大值的时候使用MAX[i][1]记录矩阵中最大值所在位置
在遍历完一行矩阵后将最大值记录并将其置0
遍历整个矩阵之后,比较所有行的最大值并且比对得到这一轮的分数,并且判断是否将矩阵中所有元素置0,是否已经完成所有元素的删除(通过将矩阵所有值相加为sum1判断sum1是否为0实现)

而在逻辑正确的前提下,发现了这些问题
在 while(sum1!=0) 循环之前,sum1 没有被初始化。需要将 sum1 初始化为非零的值,否则循环条件将永远为假,导致代码不会进入循环。
在内层的 for 循环中,对于每一行的元素求和的逻辑是不正确的。应该在外层的 for 循环之前初始化 sum1 为0,然后在内层的 for 循环中累加每个元素的值。
在内层的 for 循环中,你需要检查最大值 MAX[i][0] 是否等于当前元素值 nums[i][j],而不仅仅是检查是否大于 MAX[i][0]。如果相等,你需要更新最大值的位置 MAX[i][1]。
在 while 循环中,需要在每次迭代之前将 MAX1 初始化为0。否则,MAX1 的值将保留上一次循环的最大值。
在 while 循环中,需要更新 sum1 的值,以便在下一次迭代时正确判断是否进入循环。你可以在每次迭代之前将 sum1 赋值为 numsSize,这样如果在循环内部没有对 sum1 进行更新,循环条件将会在下一次迭代时为假,从而结束循环。

更改后的代码

int matrixSum(int** nums, int numsSize, int* numsColSize) {
    int MAX[numsSize][2];
    int MAX1 = 0;
    int sum = 0;
    int sum1 = numsSize;  // 初始化 sum1
    int i, j;
    
    while (sum1 != 0) {
        sum1 = 0;  // 重置 sum1
        MAX1 = 0;  // 重置 MAX1
        
        for (i = 0; i < numsSize; i++) {
            MAX[i][0] = 0; // num
            MAX[i][1] = 0; // location
            
            for (j = 0; j < numsColSize[i]; j++) {
                if (nums[i][j] >= MAX[i][0]) {  // 改为判断相等
                    MAX[i][0] = nums[i][j];
                    MAX[i][1] = j;
                }
                sum1 += nums[i][j];  // 累加每个元素的值
            }
            
            nums[i][MAX[i][1]] = 0;
            
            if (MAX1 < MAX[i][0])
                MAX1 = MAX[i][0];
        }
        
        sum += MAX1;
    }
    
    return sum;
}

标签:nums,int,MAX,MAX1,矩阵,sum1,循环,2679
From: https://www.cnblogs.com/noobwei/p/17535577.html

相关文章

  • 【DSY 4484】矩阵 题解(带限错排)
    DSY传送门。(带限制)错排问题。神仙题。Solution根据题目的问法,发现我们只想统计比给定矩阵\(A\)小的矩阵,记这个矩阵为\(B\)。显然,\(B\)的第\(i\)行一定从某个位置开始小于\(A\)的第\(i\)行,且前面的内容和\(A\)都是一样的。所以我们只需要枚举这个“开始变小”......
  • 牛客小白月赛75 D 矩阵
    题目链接数据范围n,m<=1e3题解构建分层图,\((i,j,0/1)\)表示在矩阵的\((i,j)\)位置上,当前状态为\(0/1\)的点。如果要到达的点和当前点的状态不同,则可以花费时间1到达。如果状态相同,则要先花费时间1改变目标点的状态再走,共花费时间2.然后就是跑最短路了。另......
  • 【LeetCode】矩阵中的和
    给你一个下标从0开始的二维整数数组nums。一开始你的分数为0。你需要执行以下操作直到矩阵变为空:矩阵中每一行选取最大的一个数,并删除它。如果一行中有多个最大的数,选择任意一个并删除。在步骤1删除的所有数字中找到最大的一个数字,将它添加到你的分数中。请你返回最......
  • [LOJ 6030]「雅礼集训 2017 Day1」矩阵 题解
    首先不难想到一个贪心,就是先填出一个全黑的行,然后再用其填黑列。而且在其中“填出一个全黑的行步数”我们应该最小化。这个贪心的正确性证明如下:必要性:填黑列的必要条件为有一个全黑的行。充分性:“填黑列的步数”就是“非全黑列的数量”。显然,如果填出一个全黑的行的过程中......
  • 2022-2023 春学期 矩阵与数值分析 考试的范围
    2022-2023春学期矩阵与数值分析考试的范围原文考试的范围......
  • 线性代数本质理解回顾(四) 逆矩阵、列空间与零空间
    此视频要通过线性变换来了解逆矩阵、列空间、秩和零空间的概念。线性代数一个作用是解方程组 这是线性方程组+ 事实上,你可以将所有的方程合并为一个向量方程。这个方程有一个包含所有常数系数的矩阵。  这不仅仅是将方程组写进一行的书写技巧。还阐释了这个问题中优美......
  • 两种常用的存图方法(邻接矩阵和链式前向星)
    今天上午模拟赛的时候,(十分错误地)判断有一道题可以用LCA混点分(然而还不如直接爆搜得分高),在敲那个LCA的代码时突然想起来我好像还没有写过LCA,想了想,是该给我的LCA写点东西了呢。但是!不出意外的,出了亿点点意外,就是我在敲板子题的时候发现经过一年的荒废,我已经完全不会链式前......
  • 【牛客小白75】D 矩阵 【bfs+优先队列】
    题目https://ac.nowcoder.com/acm/contest/60063/D题意是说,给你一张\(n*m(n,m\leq10^3)\)大小的01地图,当前点下一步只能走到相邻的点上,如果这两个点值相同,则代价为2,否则代价为1,问从(1,1)走到(n,m)最少代价是多少思路首先很容易想到只往右下走是错的,有可能往左和往上走总代价更......
  • 负荷需求响应matlab 考虑电价需求弹性系数矩阵的负荷需求响应,采用matlab进行编程,通过
    负荷需求响应matlab考虑电价需求弹性系数矩阵的负荷需求响应,采用matlab进行编程,通过价格需求矩阵确定峰谷平负荷调节量,实现了理想的削峰填谷,程序运行可靠,有详实的参考资料。这段代码主要是一个分段电价需求响应的程序,用于计算电力系统在不同电价下的负荷需求响应变化。下面我将对......
  • 2023.6.29 重构 2 行二进制矩阵
    考虑贪心策略。每一列,把1优先放在lower和upper两行中较大的那一行上。implSolution{pubfnreconstruct_matrix(upper:i32,lower:i32,colsum:Vec<i32>)->Vec<Vec<i32>>{letn=colsum.len();let(mutupper,mutlower)=(upper,l......