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