【每日一题Day276】LC2208将数组和减半的最少操作次数 | 贪心+大顶堆

简介: 【每日一题Day276】LC2208将数组和减半的最少操作次数 | 贪心+大顶堆

将数组和减半的最少操作次数【LC2208】

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

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

  • 要使操作数最少,每次操作减小的值应尽可能大。【贪心】
  • 使用大顶堆存储数组中最大的元素,每次对堆顶元素减小一半,并将减小后的元素放入堆中,反复操作,直至减小的总和大于和的一半
  • 实现
class Solution {
    public int halveArray(int[] nums) {
        PriorityQueue<Double> pq = new PriorityQueue<>((o1, o2) -> o2.compareTo(o1));
        double sum = 0.0;
        for (int num : nums){
            sum += num;
            pq.add(num + 0.0);
        }
        sum /= 2;
        int count = 0;
        while (sum > 0){
            double num = pq.poll();
            sum -= num / 2;
            pq.add(num / 2);
            count++;
        }
        return count;
    }
}

复杂度

  • 时间复杂度:O(nlogn)
  • 空间复杂度:O ( n )
目录
相关文章
|
7月前
|
算法 测试技术 C#
【贪心】【分类讨论】2499. 让数组不相等的最小总代价
【贪心】【分类讨论】2499. 让数组不相等的最小总代价
|
7月前
【每日一题Day272】LC1499满足不等式的最大值 | 单调队列 大顶堆
【每日一题Day272】LC1499满足不等式的最大值 | 单调队列 大顶堆
33 0
|
7月前
【每日一题Day179】LC1157子数组中占绝大多数的元素 | 线段树
【每日一题Day179】LC1157子数组中占绝大多数的元素 | 线段树
54 0
|
7月前
【每日一题Day361】LC2558从数量最多的堆取走礼物 | 大顶堆
【每日一题Day361】LC2558从数量最多的堆取走礼物 | 大顶堆
43 0
|
6月前
【LeetCode刷题】滑动窗口思想解决:最大连续1的个数 III、将x减到0的最小操作数
【LeetCode刷题】滑动窗口思想解决:最大连续1的个数 III、将x减到0的最小操作数
|
7月前
|
算法 测试技术 C#
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
|
7月前
|
Java
每日一题《剑指offer》数组篇之把数组排成最小的数
每日一题《剑指offer》数组篇之把数组排成最小的数
44 0
每日一题《剑指offer》数组篇之把数组排成最小的数
|
7月前
【每日一题Day220】LC1439有序矩阵中的第 k 个最小数组和 | 堆
【每日一题Day220】LC1439有序矩阵中的第 k 个最小数组和 | 堆
75 0
|
7月前
【每日一题Day157】LC1574删除最短的子数组使剩余数组有序 | 双指针 + 二分查找
【每日一题Day157】LC1574删除最短的子数组使剩余数组有序 | 双指针 + 二分查找
48 0
|
7月前
【每日一题Day192】LC1033移动石子直到连续 | 分类讨论 贪心
【每日一题Day192】LC1033移动石子直到连续 | 分类讨论 贪心
36 0