贪心算法:2.将数组和减半的最少操作次数

题目链接:2208. 将数组和减半的最少操作次数(中等)

算法原理:

解法+证明:贪心

Java代码:

java 复制代码
import java.util.PriorityQueue;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 王洋
 * Date: 2025-10-30
 * Time: 09:24
 */
class Solution {
    //2208.将数组和减半的最小操作次数
    //自己写的时候出现的三个问题
    //1.我用的是int,但是这题需要用double
    //2.lambda表达式写成(a,b)->b.compareTo(a),而不是(a,b)->b-a
    //因为nums是int[]类型,跟double不兼容
    //3.while循环里直接-=这个数的一半就行了,而我一开始用循环又统计了一遍,导致超时
    public int halveArray(int[] nums) {
        PriorityQueue<Double> heap=new PriorityQueue<>((a, b)->b.compareTo(a));
        //入堆
        double sum0=0.0;
        for(int x:nums){sum0+=(double)x;heap.add((double)x);}
        sum0/=2.0;
        double sum=0.0;
        for(double x:heap) sum+=x;
        int ret=0;
        while(sum>sum0){
            double t=heap.poll();
            t/=2.0;
            heap.offer(t);
            sum-=t;
            // for(double x:heap) sum+=x;
            ret++;
        }
        return ret;
    }
}
相关推荐
柯南二号5 小时前
【后端】【Java】一文详解Spring Boot 统一日志与链路追踪实践
java·开发语言·数据库
元亓亓亓5 小时前
LeetCode热题100--347. 前 K 个高频元素--中等
数据结构·算法·leetcode
Hello eveybody5 小时前
冒泡、选择、插入排序简介(C++)
数据结构·算法·排序算法
爱学java的ptt5 小时前
面试手撕排序
java·面试
Chen--Xing5 小时前
LeetCode 49.字母异位词分组
c++·python·算法·leetcode·rust
柯南二号5 小时前
【后端】【Java】RESTful书面应该如何写
java·开发语言·restful
长安er5 小时前
LeetCode 235 & 236 最近公共祖先(LCA)解题总结
算法·leetcode·二叉树·递归·lca
JIngJaneIL5 小时前
基于Java+ vueOA工程项目管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
im_AMBER5 小时前
Leetcode 77 数组中的最大数对和 | 统计坏数对的数目
笔记·学习·算法·leetcode