二分查找深入

题目链接:2517. 礼盒的最大甜蜜度 - 力扣(LeetCode)

题目概述:找出一个数x,使得在数组中选出k个数,这k个数差的绝对值两两之间都大于x。求x,其值需尽可能大。

题目分析:将数组进行排序,然后二分x,看x是否满足要求。

AC代码:

复制代码
class Solution {
    public int maximumTastiness(int[] price, int k) {
        int n = price.length;
        Arrays.sort(price);
        int l = 0, r = price[n - 1];
        while (l <= r) {
            int x = l + (r - l) / 2;
            int temp = 0, cnt = 0;
            for (int i = 0; i < n; ++i) { //每次选择尽可能小的数,则下一个数也尽可能小,以此贪心计算下一个可能选中的数,同时记录找到的数字个数。
                if (temp < price[i]) {
                    temp = price[i] + x;
                    cnt++;
                }
            }
            if (cnt < k) { //cnt < k,则x的值过大,将右下标向中点位置移动,不断二分直到cnt能够大于等于k,本质上类似于lower_bound()。
                r = x - 1;
            } else {
                l = x + 1;
            }
        }
        return l;
    }
}
复制代码

 

posted @   yang_ever  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示