【每日一题Day224】LC2517礼盒的最大甜蜜度 | 二分答案

这篇具有很好参考价值的文章主要介绍了【每日一题Day224】LC2517礼盒的最大甜蜜度 | 二分答案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

礼盒的最大甜蜜度【LC2517】

You are given an array of positive integers price where price[i] denotes the price of the ith candy and a positive integer k.

The store sells baskets of k distinct candies. The tastiness of a candy basket is the smallest absolute difference of the prices of any two candies in the basket.

Return the maximum tastiness of a candy basket.

最大化最小化类似题目

  • 思路:使用二分查找的方式寻找最大甜蜜度

    • 本题的单调性为:当**最小甜蜜度【数组中任意两个元素的差值的绝对值的最小值】**越大,糖果的可以选择的种类越小【选取的数组中的元素个数】,因此可以通过二分查找法找到最终答案
    • 将题意转化为:当选取的数量一定时,寻找最小甜蜜度的最大值 y y y,二分查找的下限为0,上限为数组中最大元素与最小元素的差值/(k-1)
  • 实现

    • 首先对price数组进行升序排序

    • 然后进行二分查找,当二分查找最小甜蜜度 y y y时,需要判断能否取出 k k k种糖果,如果能取出 k k k种糖果,那么我们可以增大差值,已获得更大的最小甜蜜度;如果不能取出 k k k中糖果,那么减小差值

    • 每次查找成功,记录当前的最小甜蜜度,最后一次的最小甜蜜度即为最大最小甜蜜度

    • 如何判断当前的差值能够取出多少种糖果?

      模拟迭代,第一种糖果取 p r i c e [ 0 ] price[0] price[0],第一种糖果取 p r i c e [ 0 ] + y price[0]+y price[0]+y p r i c e [ i ] price[i] price[i]处……

  • 代码文章来源地址https://www.toymoban.com/news/detail-467361.html

    class Solution {
        public int maximumTastiness(int[] price, int k) {
            Arrays.sort(price);
            int n = price.length;
            int l = 0, r = price[n - 1] - price[0];
            int ans = 0;
            while (l <= r){
                int mid = (r + l) / 2;
                if (check(price, mid ,k)){
                    ans = mid;
                    l = mid + 1;
                }else{
                    r = mid - 1;
                }
            }
            return ans;
    
        }
        public boolean check(int[] price, int m, int k){
            int count = 1;
            int preIndex = 0;
            for (int i = 1; i < price.length; i++){
                if (price[i] - price[preIndex] >= m ){
                    count++;
                    preIndex = i;
                }
            }
            return count >= k;
        }
    }
    
    • 复杂度
      • 时间复杂度: O ( n l o g ( n C ) ) O(nlog(nC)) O(nlog(nC)) n n n是数组的长度,C是数组中的最大值与最小值的差值。排序需要的时间复杂度为 O ( n l o g n ) O(nlog n) O(nlogn),二分查找的时间复杂度是 O ( l o g C ) O(logC) O(logC),每次二分查找需要判断是否符合条件的时间复杂度为 O ( n ) O(n) O(n),因此总的时间复杂度为 O ( n l o g ( n c ) ) O(nlog(nc)) O(nlog(nc))
      • 空间复杂度: O ( l o g n ) O(logn) O(logn),排序所需要的栈空间

到了这里,关于【每日一题Day224】LC2517礼盒的最大甜蜜度 | 二分答案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【每日一题Day282】LC2681英雄力量 | 排序+数学

    给你一个下标从 0 开始的整数数组 nums ,它表示英雄的能力值。如果我们选出一部分英雄,这组英雄的 力量 定义为: i0 , i1 ,… ik 表示这组英雄在数组中的下标。那么这组英雄的力量为 max(nums[i0],nums[i1] ... nums[ik])2 * min(nums[i0],nums[i1] ... nums[ik]) 。 请你返回所有可能的 非空

    2024年02月14日
    浏览(33)
  • 【每日一题Day168】LC2427公因子的数目 | 模拟

    给你两个正整数 a 和 b ,返回 a 和 b 的 公 因子的数目。 如果 x 可以同时整除 a 和 b ,则认为 x 是 a 和 b 的一个 公因子 。 简单模拟 感谢力扣 今天还要开会 我恨 感觉习惯真的很容易突然改变 前段时间还是看英文题目的 突然每一天就没有看英文题了 然后这个习惯就没有了

    2023年04月08日
    浏览(26)
  • 【每日一题Day281】LC142链表 Ⅱ| 快慢指针 哈希表

    环形链表 Ⅱ【LC142】 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(

    2024年02月15日
    浏览(47)
  • 【每日一题Day222】LC1110删点成林 | dfs后序

    给出二叉树的根节点 root ,树上每个节点都有一个不同的值。 如果节点值在 to_delete 中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合)。 返回森林中的每棵树。你可以按任意顺序组织答案。 又是一段瓶颈期 2023/5/30 思路 遍历树时,如果

    2024年02月07日
    浏览(32)
  • 【每日一题Day266】LC18四数之和 | 排序+双指针

    四数之和【 LC18 】 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且 不重复 的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): 0 = a, b, c, d n a 、 b 、 c 和 d 互不相同 nums[a] + nums[b]

    2024年02月16日
    浏览(30)
  • 【每日一题Day292】LC1572矩阵对角线元素的和 模拟

    思路 简单模拟,主对角线的元素横纵坐标相等,副对角线的元素横纵坐标相加为n-1,注意避免重复计算 实现 复杂度 时间复杂度: O ( log ⁡ n ) mathcal{O}(log n) O ( lo g n ) 空间复杂度: O ( 1 ) mathcal{O}(1) O ( 1 )

    2024年02月13日
    浏览(28)
  • 【每日一题Day267】LC834树中距离之和 | 换根dp

    树中距离之和【LC834】 给定一个无向、连通的树。树中有 n 个标记为 0...n-1 的节点以及 n-1 条边 。 给定整数 n 和数组 edges , edges[i] = [ai, bi] 表示树中的节点 ai 和 bi 之间有一条边。 返回长度为 n 的数组 answer ,其中 answer[i] 是树中第 i 个节点与所有其他节点之间的距离之和。

    2024年02月16日
    浏览(28)
  • 【每日一题Day191】LC2423删除字符使频率相同 | 枚举 分类讨论

    给你一个下标从 0 开始的字符串 word ,字符串只包含小写英文字母。你需要选择 一个 下标并 删除 下标处的字符,使得 word 中剩余每个字母出现 频率 相同。 如果删除一个字母后, word 中剩余所有字母的出现频率都相同,那么返回 true ,否则返回 false 。 注意: 字母 x 的 频

    2024年02月01日
    浏览(31)
  • 【每日一题Day208】LC1335工作计划的最低难度 | 动态规划

    工作计划的最低难度【LC1335】 你需要制定一份 d 天的工作计划表。工作之间存在依赖,要想执行第 i 项工作,你必须完成全部 j 项工作( 0 = j i )。 你每天 至少 需要完成一项任务。工作计划的总难度是这 d 天每一天的难度之和,而一天的工作难度是当天应该完成工作的最大

    2024年02月05日
    浏览(59)
  • 算法每日一题: 分割数组的最大值 | 动归 | 分割数组 | 贪心+二分

    Hello,大家好,我是星恒 呜呜呜,今天给大家带来的又是一道经典的动归难题。 题目:leetcode 410 给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k_ 个非空的连续子数组。 设计一个算法使得这 k _个子数组各自和的最大值最小。 示例: 示例 1: 示例 2: 示例

    2024年01月22日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包