LeetCode 2208. 将数组和减半的最少操作次数:贪心(优先队列)

【LetMeFly】2208.将数组和减半的最少操作次数:贪心(优先队列)

力扣题目链接:https://leetcode.cn/problems/minimum-operations-to-halve-array-sum/

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

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

示例 1:

复制代码
输入:nums = [5,19,8,1]
输出:3
解释:初始 nums 的和为 5 + 19 + 8 + 1 = 33 。
以下是将数组和减少至少一半的一种方法:
选择数字 19 并减小为 9.5 。
选择数字 9.5 并减小为 4.75 。
选择数字 8 并减小为 4 。
最终数组为 [5, 4.75, 4, 1] ,和为 5 + 4.75 + 4 + 1 = 14.75 。
nums 的和减小了 33 - 14.75 = 18.25 ,减小的部分超过了初始数组和的一半,18.25 >= 33/2 = 16.5 。
我们需要 3 个操作实现题目要求,所以返回 3 。
可以证明,无法通过少于 3 个操作使数组和减少至少一半。

示例 2:

复制代码
输入:nums = [3,8,20]
输出:3
解释:初始 nums 的和为 3 + 8 + 20 = 31 。
以下是将数组和减少至少一半的一种方法:
选择数字 20 并减小为 10 。
选择数字 10 并减小为 5 。
选择数字 3 并减小为 1.5 。
最终数组为 [1.5, 8, 5] ,和为 1.5 + 8 + 5 = 14.5 。
nums 的和减小了 31 - 14.5 = 16.5 ,减小的部分超过了初始数组和的一半, 16.5 >= 31/2 = 16.5 。
我们需要 3 个操作实现题目要求,所以返回 3 。
可以证明,无法通过少于 3 个操作使数组和减少至少一半。

提示:

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

方法一:贪心(优先队列)

思路很简单,每次将数组中最大的元素减半即可。

具体怎么实现呢?很多编程语言都有"优先队列"。因此我们只需要使用一个大根堆(出队时大元素优先的优先队列),每次将队首元素取出减半并放回即可。

  • 时间复杂度 O ( l e n ( n u m s ) × log ⁡ l e n ( n u m s ) ) O(len(nums)\times \log len(nums)) O(len(nums)×loglen(nums)),操作次数不超过数组长度。
  • 空间复杂度 O ( l e n ( n u m s ) ) O(len(nums)) O(len(nums))

AC代码

C++

cpp 复制代码
class Solution {
public:
    int halveArray(vector<int>& nums) {
        priority_queue<double> pq;
        double s = 0;
        for (int t : nums) {
            pq.push(t);
            s += t;
        }
        double need = s / 2;
        int ans = 0;
        while (need > 0) {
            double thisValue = pq.top();
            pq.pop();
            thisValue /= 2;
            need -= thisValue;
            pq.push(thisValue);
            ans++;
        }
        return ans;
    }
};

Python

python 复制代码
# from typing import List
# import heapq

class Solution:
    def halveArray(self, nums: List[int]) -> int:
        pq = []
        s = 0
        for t in nums:
            heapq.heappush(pq, -t)
            s += t
        need = s / 2
        ans = 0
        while need > 0:
            thisValue = -heapq.heappop(pq)
            thisValue /= 2
            need -= thisValue
            ans += 1
            heapq.heappush(pq, -thisValue)
        return ans

同步发文于CSDN,原创不易,转载请附上原文链接哦~

Tisfy:https://letmefly.blog.csdn.net/article/details/131908685

相关推荐
wadesir几秒前
掌握Rust并发数据结构(从零开始构建线程安全的多线程应用)
数据结构·安全·rust
Fuly10247 分钟前
大模型剪枝(Pruning)技术简介
算法·机器学习·剪枝
Xの哲學13 分钟前
Linux网卡注册流程深度解析: 从硬件探测到网络栈
linux·服务器·网络·算法·边缘计算
bubiyoushang88817 分钟前
二维地质模型的表面重力值和重力异常计算
算法
仙俊红44 分钟前
LeetCode322零钱兑换
算法
颖风船1 小时前
锂电池SOC估计的一种算法(改进无迹卡尔曼滤波)
python·算法·信号处理
551只玄猫1 小时前
KNN算法基础 机器学习基础1 python人工智能
人工智能·python·算法·机器学习·机器学习算法·knn·knn算法
charliejohn1 小时前
计算机考研 408 数据结构 哈夫曼
数据结构·考研·算法
POLITE31 小时前
Leetcode 41.缺失的第一个正数 JavaScript (Day 7)
javascript·算法·leetcode