前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 1887. 使数组元素相等的减少操作次数(map)

LeetCode 1887. 使数组元素相等的减少操作次数(map)

作者头像
Michael阿明
发布2021-09-06 11:08:46
3650
发布2021-09-06 11:08:46
举报
文章被收录于专栏:Michael阿明学习之路

文章目录

1. 题目

给你一个整数数组 nums ,你的目标是 nums 中的所有元素相等。完成一次减少操作需要遵照下面的几个步骤:

  • 找出 nums 中的 最大 值。记这个值为 largest 并取其下标 i (下标从 0 开始计数)。如果有多个元素都是最大值,则取最小的 i 。
  • 找出 nums 中的 下一个最大 值,这个值 严格小于 largest ,记为 nextLargest 。
  • 将 nums[i] 减少 nextLargest 。

返回使 nums 中的所有元素相等的操作次数

代码语言:javascript
复制
示例 1:
输入:nums = [5,1,3]
输出:3
解释:需要 3 次操作使 nums 中的所有元素相等:
1. largest = 5 下标为 0 。nextLargest = 3 。将 nums[0] 减少到 3 。nums = [3,1,3] 。
2. largest = 3 下标为 0 。nextLargest = 1 。将 nums[0] 减少到 1 。nums = [1,1,3] 。
3. largest = 3 下标为 2 。nextLargest = 1 。将 nums[2] 减少到 1 。nums = [1,1,1] 。

示例 2:
输入:nums = [1,1,1]
输出:0
解释:nums 中的所有元素已经是相等的。

示例 3:
输入:nums = [1,1,2,2,3]
输出:4
解释:需要 4 次操作使 nums 中的所有元素相等:
1. largest = 3 下标为 4 。nextLargest = 2 。将 nums[4] 减少到 2 。nums = [1,1,2,2,2] 。
2. largest = 2 下标为 2 。nextLargest = 1 。将 nums[2] 减少到 1 。nums = [1,1,1,2,2] 。 
3. largest = 2 下标为 3 。nextLargest = 1 。将 nums[3] 减少到 1 。nums = [1,1,1,1,2] 。 
4. largest = 2 下标为 4 。nextLargest = 1 。将 nums[4] 减少到 1 。nums = [1,1,1,1,1] 。

提示:
  1 <= nums.length <= 5 * 10^4
  1 <= nums[i] <= 5 * 10^4

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reduction-operations-to-make-the-array-elements-equal 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 使用 map 计数
  • 找到末尾最大的两个数字,将最大的数字转为次大的数字即可,然后删除最大的,循环直到map只有一个数字
代码语言:javascript
复制
class Solution {
public:
    int reductionOperations(vector<int>& nums) {
        map<int, int> m;
        for(auto n : nums)
            m[n]++;
        int ans = 0;
        while(m.size() > 1)
        {
            auto it = m.end();
            it--;
            int x = it->first; // 最大的数字
            int ct = it->second; // 其个数
            it--;
            int y = it->first; // 次大的数字
            m[y] += ct; // x - > y
            ans += ct; // 操作次数
            m.erase(x); // 删除 x
        }
        return ans;
    }
};

548 ms 121.2 MB C++

  • 直接排序,检查相同的数字的个数,到下一个不一样的数字时累加到答案中
代码语言:javascript
复制
class Solution {
public:
    int reductionOperations(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int ans = 0, ct = 0, n = nums.back();
        for(int i = nums.size()-1; i >= 0; --i)
        {   
            if(nums[i] != n)
            {
                ans += ct;
                n = nums[i];
            }
            ct++;
        }
        return ans;
    }
};

208 ms 80.9 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/06/11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档