给你一个正整数数组 price ,其中 price[i] 表示第 i 类糖果的价格,另给你一个正整数 k 。
商店组合 k 类 不同 糖果打包成礼盒出售。礼盒的 甜蜜度 是礼盒中任意两种糖果 价格 绝对差的最小值。
返回礼盒的 最大 甜蜜度。
https://leetcode.cn/problems/maximum-tastiness-of-candy-basket/description/
- 二分查找,区间【0,price的最大值-最小值】,边界条件、循环条件、mid计算方法
- 两数相差值大于mid的数量大于等于k-1,则满足甜度要求
/*
* Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved.
*/
package com.huawei.prac;
import java.util.Arrays;
class SolutionNd {
public static void main(String[] args) {
int[] price = {13, 5, 1, 8, 21, 2};
int k = 3;
System.out.println(maximumTastiness(price, k));
}
/**
* 2517[参考]. 礼盒的最大甜蜜度【二分查找 + 逻辑转化】
*
* @param price price[i] 表示第 i 类糖果的价格
* @param k 选取 k 种糖果
* @return k种糖果价格 绝对差的最小值,最小值中的最大值
*/
public static int maximumTastiness(int[] price, int k) {
Arrays.sort(price);
// 二分查找,区间【0,price的最大值-最小值】
int left = 0;
int right = price[price.length - 1] - price[0];
int mid;
while (left < right) {
mid = right - ((right - left) >> 1);
if (isValid(price, mid, k)) {
left = mid;
} else {
right = mid - 1;
}
}
return left;
}
private static boolean isValid(int[] price, int mid, int k) {
int tmp = price[0];
int count = 1;
// 两数相差值大于mid的数量大于等于k-1,则满足要求
for (int i = 1; i < price.length; i++) {
if (price[i] - tmp >= mid) {
count++;
tmp = price[i];
}
}
return count >= k;
}
}