【每日一题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 )
目录
相关文章
|
6月前
|
算法 测试技术 C#
【贪心】【分类讨论】2499. 让数组不相等的最小总代价
【贪心】【分类讨论】2499. 让数组不相等的最小总代价
|
6月前
【每日一题Day272】LC1499满足不等式的最大值 | 单调队列 大顶堆
【每日一题Day272】LC1499满足不等式的最大值 | 单调队列 大顶堆
31 0
|
6月前
【每日一题Day361】LC2558从数量最多的堆取走礼物 | 大顶堆
【每日一题Day361】LC2558从数量最多的堆取走礼物 | 大顶堆
38 0
|
5月前
|
存储 算法 数据可视化
力扣155题最全解法:如何实现支持常数时间获取最小值的最小栈(附详细图解和复杂度分析)
力扣155题最全解法:如何实现支持常数时间获取最小值的最小栈(附详细图解和复杂度分析)
|
5月前
【LeetCode刷题】滑动窗口思想解决:最大连续1的个数 III、将x减到0的最小操作数
【LeetCode刷题】滑动窗口思想解决:最大连续1的个数 III、将x减到0的最小操作数
|
6月前
【每日一题Day220】LC1439有序矩阵中的第 k 个最小数组和 | 堆
【每日一题Day220】LC1439有序矩阵中的第 k 个最小数组和 | 堆
71 0
|
6月前
【每日一题Day157】LC1574删除最短的子数组使剩余数组有序 | 双指针 + 二分查找
【每日一题Day157】LC1574删除最短的子数组使剩余数组有序 | 双指针 + 二分查找
44 0
|
算法
【算法专题突破】双指针 - 最大连续1的个数 III(11)
【算法专题突破】双指针 - 最大连续1的个数 III(11)
34 0
|
算法 C++
剑指offer(C++)-JZ40:最小的K个数(算法-排序)
剑指offer(C++)-JZ40:最小的K个数(算法-排序)
|
算法 C++
剑指offer(C++)-JZ53:数字在升序数组中出现的次数(算法-搜索算法)
剑指offer(C++)-JZ53:数字在升序数组中出现的次数(算法-搜索算法)
下一篇
无影云桌面