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

__EOF__

本文作者noobwei
本文链接https://www.cnblogs.com/noobwei/p/17535577.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   noobwei  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示