[M贪心] lc1887. 使数组元素相等的减少操作次数(贪心+思维+周赛244_2)

Posted Ypuyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[M贪心] lc1887. 使数组元素相等的减少操作次数(贪心+思维+周赛244_2)相关的知识,希望对你有一定的参考价值。

1. 题目来源

链接:1887. 使数组元素相等的减少操作次数

2. 题目解析

贪心题。

根据题意,每次找到最大值,将其变为次大值,最终所有数都将变为最小值。

那么每个数变得次数就是比它严格小的数的个数,针对重复数字只考虑一次。

排序后拿变量维护有多少有多少数严格大于当前数即可。


时间复杂度: O ( n 2 ) O(n^2) O(n2)

空间复杂度: O ( n 2 ) O(n^2) O(n2)


class Solution {
public:
    int reductionOperations(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int res = 0;
        for (int i = 1, s = 0; i < nums.size(); i ++ ) {
            if (nums[i] != nums[i - 1]) s ++ ;
            res += s;
        }
        
        return res;
    }
};

貌似大佬蛮喜欢这样写的,利用 mapgreater<int> 参数来处理:

class Solution {
public:
    int reductionOperations(vector<int>& nums) {
        map<int, int, greater<int>> mp;
        for (int x : nums) mp[x] += 1;
        int ans = 0, s = 0;
        for (auto [k, v] : mp) {
            ans += s;
            s += v;
        } 

        return ans;
    }
};

以上是关于[M贪心] lc1887. 使数组元素相等的减少操作次数(贪心+思维+周赛244_2)的主要内容,如果未能解决你的问题,请参考以下文章

[M贪心] lc1838. 最高频元素的频数(前缀和+二分+双指针+滑动窗口+周赛238_2)

[M贪心] lc1888. 使二进制字符串字符交替的最少反转次数(贪心+前后缀分解+周赛244_3)

[M贪心] lc1877. 数组中最大数对和的最小值(贪心+双周赛53_2)

[M贪心] lc763. 划分字母区间(贪心+代码实现)

[M贪心] lc763. 划分字母区间(贪心+代码实现)

[M数学] lc1802. 有界数组中指定下标处的最大值(贪心+二分+数学推公式)