LeetCode——5839. 移除石子使总数最小(Remove Stones to Minimize the Total)[中等]——分析及代码(Java)

该博客详细分析了如何利用优先队列(大顶堆)解决LeetCode中的一道中等难度问题——5839.移除石子使总数最小。通过选取最大石子堆并移除一半,执行k次操作,找到剩余石子的最小总数。提供的Java代码实现能在限制时间内高效完成运算,并取得了优秀的运行时间和内存消耗表现。
摘要由CSDN通过智能技术生成

LeetCode——5839. 移除石子使总数最小[Remove Stones to Minimize the Total][中等]——分析及代码[Java]

一、题目

给你一个整数数组 piles ,数组 下标从 0 开始 ,其中 piles[i] 表示第 i 堆石子中的石子数量。另给你一个整数 k ,请你执行下述操作 恰好 k 次:

  • 选出任一石子堆 piles[i] ,并从中 移除 floor(piles[i] / 2) 颗石子。

注意:你可以对 同一堆 石子多次执行此操作。

返回执行 k 次操作后,剩下石子的 最小 总数。

floor(x) 为 小于 或 等于 x 的 最大 整数。(即,对 x 向下取整)。

示例 1:

输入:piles = [5,4,9], k = 2
输出:12
解释:可能的执行情景如下:
- 对第 2 堆石子执行移除操作,石子分布情况变成 [5,4,5] 。
- 对第 0 堆石子执行移除操作,石子分布情况变成 [3,4,5] 。
剩下石子的总数为 12 。

示例 2:

输入:piles = [4,3,6,7], k = 3
输出:12
解释:可能的执行情景如下:
- 对第 2 堆石子执行移除操作,石子分布情况变成 [4,3,3,7] 。
- 对第 3 堆石子执行移除操作,石子分布情况变成 [4,3,3,4] 。
- 对第 0 堆石子执行移除操作,石子分布情况变成 [2,3,3,4] 。
剩下石子的总数为 12 。

提示:

  • 1 <= piles.length <= 10^5
  • 1 <= piles[i] <= 10^4
  • 1 <= k <= 10^5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-stones-to-minimize-the-total
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 优先队列(堆)

(1)思路

设计一个大顶堆(优先队列),初始化时存入所有的石子堆。执行 k 次操作,每次从队列中取出最大的石子堆,移除最多数量的石子,再将剩余石子放回队中。最后统计堆中剩余的石子总数。

(2)代码

class Solution {
    public int minStoneSum(int[] piles, int k) {
        //移除石子
        PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> b - a);//大顶堆
        for (int pile : piles)//所有石子堆入队
            pq.offer(pile);
        for (int i = 0; i < k; i++) {//执行k次操作
            int num = pq.poll();//取出最大的石子堆
            num = num - num / 2;//移除最多数量的石子
            pq.offer(num);//将剩余石子放回队中
        }
        
        //统计堆中剩余的石子总数
        int ans = 0;
        while (!pq.isEmpty())
            ans += pq.poll();
        return ans;
    }
}

(3)结果

执行用时 :464 ms,在所有 Java 提交中击败了 100.00% 的用户;
内存消耗 :53.4 MB,在所有 Java 提交中击败了 100.00% 的用户。
(目前提交用户量不足,暂无排名)

三、其他

暂无。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值