[杨小白]_leetcode_力扣_第 325 场周赛-第三题

148 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第33天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标2000分,现在1968!!

力扣第 325 场周赛-力扣

第 325 场周赛

阳了,没起来参加

image.png

image.png

image.png

image.png

image.png

2517. 礼盒的最大甜蜜度

给你一个正整数数组 price ,其中 price[i] 表示第 i 类糖果的价格,另给你一个正整数 k 。

商店组合 k 类 不同 糖果打包成礼盒出售。礼盒的 甜蜜度 是礼盒中任意两种糖果 价格 绝对差的最小值。

返回礼盒的 最大 甜蜜度。

示例1:

输入:price = [13,5,1,8,21,2], k = 3

输出:8

解释:选出价格分别为 [13,5,21] 的三类糖果。

礼盒的甜蜜度为 min(|13 - 5|, |13 - 21|, |5 - 21|) = min(8, 8, 16) = 8 。

可以证明能够取得的最大甜蜜度就是 8 。

示例 2:

输入:price = [1,3,1], k = 2

输出:2

解释:选出价格分别为 [1,3] 的两类糖果。

礼盒的甜蜜度为 min(|1 - 3|) = min(2) = 2 。

可以证明能够取得的最大甜蜜度就是 2 。

示例 3:

输入: price = [7,7,7,7], k = 2

输出: 0

解释: 从现有的糖果中任选两类糖果,甜蜜度都会是 0 。

提示:

  • 1 <= price.length <= 105
  • 1 <= price[i] <= 109
  • 2 <= k <= price.length

代码

第二题是二分,第三题也容易想到二分。

先把糖果排序后,二分答案,去取,如果可以取到。说明答案小于等于mid,如果取不到,说明答案大于mid。

方法

class Solution {
    public int maximumTastiness(int[] price, int k) {
        Arrays.sort(price);
        int i = 0, j = price[price.length - 1];
        while (i < j) {
            int mid = i + (j - i + 1) / 2;
            if (check(price, mid) < k) {
                j = mid - 1;
            } else {
                i = mid;
            }
        }
        return i;
    }
    private int check(int[] price, int mid) {
        int cnt = 1, pre = price[0];
        for (int i = 1; i < price.length; i++) {
            if (price[i] - pre >= mid) {
                cnt++;
                pre = price[i];
            }
        }
        return cnt;
    }
}