二分查找深入
题目链接: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; } }

浙公网安备 33010602011771号