二分查找深入
题目链接: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; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】