0
点赞
收藏
分享

微信扫一扫

自己动手写编译器:实现命令行模块

花姐的职场人生 2023-10-01 阅读 44

点击直接跳转到该题目

目录

1️⃣题目描述

给你一个正整数数组 nums 。每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。(注意,在后续操作中你可以对减半过的数继续执行操作)

请你返回将 nums 数组和 至少 减少一半的 最少 操作数。

示例 1:

示例 2:

注意:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 107

2️⃣题目解析

本题不是很复杂,并没有很明显的使用贪心策略,只是简单的使用优先队列(堆)来动态地获取数组中的最大值并将其逐步减半,直到元素的和不超过原始数组元素和的一半

3️⃣解题代码

class Solution {
public:
    int halveArray(vector<int>& nums) {
        priority_queue<double> heap;
        double sum = 0.0;
        int count = 0;
        for(int x : nums)
        {
            heap.push(x);
            sum += x;
        }
        sum /= 2;
        while(sum > 0)
        {
            double tmp = heap.top() / 2.0;
            sum -= tmp;
            heap.pop();
            count++;
            heap.push(tmp);
        }
        return count;
    }
};

最后就通过啦:
在这里插入图片描述

举报

相关推荐

0 条评论