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

posted @ 2023-07-07 17:13  noobwei  阅读(7)  评论(0编辑  收藏  举报