【每日一题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 )
目录
相关文章
|
4天前
|
算法 测试技术 C#
【贪心】【分类讨论】2499. 让数组不相等的最小总代价
【贪心】【分类讨论】2499. 让数组不相等的最小总代价
|
4天前
【每日一题Day272】LC1499满足不等式的最大值 | 单调队列 大顶堆
【每日一题Day272】LC1499满足不等式的最大值 | 单调队列 大顶堆
20 0
|
4天前
【每日一题Day361】LC2558从数量最多的堆取走礼物 | 大顶堆
【每日一题Day361】LC2558从数量最多的堆取走礼物 | 大顶堆
25 0
|
4天前
【每日一题Day220】LC1439有序矩阵中的第 k 个最小数组和 | 堆
【每日一题Day220】LC1439有序矩阵中的第 k 个最小数组和 | 堆
22 0
|
4天前
【每日一题Day157】LC1574删除最短的子数组使剩余数组有序 | 双指针 + 二分查找
【每日一题Day157】LC1574删除最短的子数组使剩余数组有序 | 双指针 + 二分查找
19 0
|
4天前
|
vr&ar
【每日一题Day166】LC1053交换一次的先前排列 | 贪心
【每日一题Day166】LC1053交换一次的先前排列 | 贪心
51 1
|
4天前
【每日一题Day192】LC1033移动石子直到连续 | 分类讨论 贪心
【每日一题Day192】LC1033移动石子直到连续 | 分类讨论 贪心
20 0
|
4天前
|
Java
每日一题《剑指offer》数组篇之把数组排成最小的数
每日一题《剑指offer》数组篇之把数组排成最小的数
27 0
每日一题《剑指offer》数组篇之把数组排成最小的数
|
7月前
|
算法
【算法专题突破】双指针 - 最大连续1的个数 III(11)
【算法专题突破】双指针 - 最大连续1的个数 III(11)
20 0
|
7月前
|
算法 C++
剑指offer(C++)-JZ40:最小的K个数(算法-排序)
剑指offer(C++)-JZ40:最小的K个数(算法-排序)