删除每行中的最大值问题


class Solution {
public:
    int deleteGreatestValue(vector<vector<int>>& grid) {
        int m=grid.size();
        int res=0;
        for(int j=0;j<m;j++){
            int row_max=0;
            for(int i=0;i<m;i++){
                auto rm=max_element(grid[i].begin(),grid[i].end());
                if(*rm>row_max){
                    row_max=*rm;
                }
                *rm=0;
            }
            res+=row_max;
        }
        return res;
    }
};

题目https://leetcode.cn/problems/delete-greatest-value-in-each-row/
思路:找每一行的最大值,找到row-max为所有的行的最大值,然后每一行最大值改为0,为什么输出错误(不用排序做,我会那种方法)

int deleteGreatestValue(vector<vector<int>>& grid) {
    int res = 0;
    int m = grid.size();
    for (int i = 0; i < m; i++) {
        int row_max = 0;
        for (int j = 0; j < m; j++) {
            auto rm = max_element(grid[j].begin(), grid[j].end());
            if (*rm > row_max) {
                row_max = *rm;
            }
        }
        for (int j = 0; j < m; j++) {
            auto rm = max_element(grid[j].begin(), grid[j].end());
            if (*rm == row_max) {
                *rm = 0;
                break;
            }
        }
        res += row_max;
    }
    return res;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答由chatgpt基于相关博客总结生成:

    首先,我们来看一下你的代码,找出其中的问题。

    class Solution {
    public:
        int deleteGreatestValue(vector<vector<int>>& grid) {
            int m = grid.size(); // 获取行数
            int res = 0;
            for(int j=0;j<m;j++){ // 遍历行
                int row_max = 0;
                for(int i=0;i<m;i++){ // 遍历列
                    auto rm = max_element(grid[i].begin(),grid[i].end()); // 找到当前行的最大值
                    if(*rm>row_max){ // 如果当前行的最大值大于当前行的最大值
                        row_max=*rm; // 更新当前行的最大值
                    }
                    *rm=0; // 将当前行的最大值改为0
                }
                res+=row_max; // 将当前行的最大值加到结果中
            }
            return res; // 返回结果
        }
    };
    

    根据问题描述,我们需要删除每一行中的最大值,然后计算被删除的最大值之和。你的代码的问题在于,在内层循环中,你通过auto rm = max_element(grid[i].begin(),grid[i].end())找到当前行的最大值,然后将其置为0。但是,这会影响到后续的max_element函数的结果,导致错误的输出。

    下面是一个改进的解决方案,用于删除每一行中的最大值:

    class Solution {
    public:
        int deleteGreatestValue(vector<vector<int>>& grid) {
            int m = grid.size(); // 获取行数
            int n = grid[0].size(); // 获取列数
            int res = 0;
    
            for (int i = 0; i < m; i++) { // 遍历每一行
                int row_max = grid[i][0]; // 设置当前行的最大值为第一个元素
    
                for (int j = 1; j < n; j++) { // 遍历每一列
                    if (grid[i][j] > row_max) { // 如果当前元素大于当前行的最大值
                        res += row_max; // 将当前行的最大值加到结果中
                        row_max = grid[i][j]; // 更新当前行的最大值
                    } else {
                        res += grid[i][j]; // 否则,将当前元素加到结果中
                    }
                }
    
                res += row_max; // 将当前行的最大值加到结果中
            }
    
            return res; // 返回结果
        }
    };
    

    这个改进的解决方案通过遍历每一行和每一列,找到当前行的最大值并计算结果。与你的代码不同的是,我使用了一个额外的变量row_max来保存当前行的最大值,并在遍历列的过程中进行更新。通过这种方式,我们可以确保不修改原始的grid数组,避免了影响到后续的计算结果。

    你可以将这个解决方案尝试用于解决问题。如果还有其他问题,或者需要进一步帮助,请随时和我说。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^