【二分查找】LCP 18. 早餐组合

简介: 【二分查找】LCP 18. 早餐组合

📍前言

🕺作者: 迷茫的启明星


学习路线

C语言从0到1

C++初阶

数据结构从0到1

😘欢迎关注:👍点赞🙌收藏✍️留言


🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!!


持续更新中~


【二分查找】LCP 18. 早餐组合

在另一篇博客里讲过二分法的模板:

《二分法的模板讲解》


题目描述:

小扣在秋日市集选择了一家早餐摊位,一维整型数组 staple 中记录了每种主食的价格,一维整型数组 drinks 中记录了每种饮料的价格。小扣的计划选择一份主食和一款饮料,且花费不超过 x 元。请返回小扣共有多少种购买方案。


注意:答案需要以 1e9 + 7 () 为底取模,如:计算初始结果为:,请返回 1

解题思路:

首先,我们需要对主食和饮料的价格进行排序。这样,我们可以在遍历主食价格的同时,使用二分查找法在有序的饮料价格中找到合适的饮料价格,使得主食和饮料的总价格不超过 x 元。


为了实现二分查找,我们需要定义左右指针 left 和 right,以及中间指针 mid。在每一次循环中,我们比较 drinks[mid] 与目标价格 target,即 x - staple[i]。如果 drinks[mid] 小于等于 target,说明饮料价格还有可能在左侧区间,所以我们将 left 指针更新为 mid + 1。否则,我们将 right 指针更新为 mid - 1。


当遍历完所有的主食价格后,我们将得到的购买方案数量 count 对 1e9 + 7 取模,最后返回 count。


代码实现:

class Solution {
public:
    int breakfastNumber(vector<int>& staple, vector<int>& drinks, int x) {
        sort(staple.begin(), staple.end());
        sort(drinks.begin(), drinks.end());
        int count = 0;
        for (int i = 0; i < staple.size(); ++i) {
            int target = x - staple[i];
            int left = 0, right = drinks.size() - 1;
            while (left <= right) {
                int mid = left + (right - left) / 2;
                if (drinks[mid] <= target) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
            count = (count + left) % ***;
        }
        return count;
    }
};



总结:

这道题目考察了排序和二分查找法在求解组合问题中的应用。通过将主食和饮料的价格排序,我们可以在 O(nlogn) 的时间复杂度内完成购买方案的查找。而二分查找法在这里起到了关键作用,使得我们可以在 O(logn) 的时间复杂度内找到合适的饮料价格。


相关文章
|
6月前
|
测试技术
【动态规划】【状态压缩】LCP04 覆盖
【动态规划】【状态压缩】LCP04 覆盖
|
6月前
|
算法 测试技术 C++
【动态规划】【前缀和】【C++算法】LCP 57. 打地鼠
【动态规划】【前缀和】【C++算法】LCP 57. 打地鼠
【动态规划】【树形dp】【深度优先搜索】LCP 26. 导航装置
【动态规划】【树形dp】【深度优先搜索】LCP 26. 导航装置
|
6月前
|
并行计算 测试技术 区块链
【图论】【堆优化的单源路径】LCP 20. 快速公交
【图论】【堆优化的单源路径】LCP 20. 快速公交
|
6月前
【每日一题Day213】LCP 33. 蓄水 | 枚举+贪心
【每日一题Day213】LCP 33. 蓄水 | 枚举+贪心
43 0
|
6月前
【每日一题Day327】LCP 50. 宝石补给 | 模拟
【每日一题Day327】LCP 50. 宝石补给 | 模拟
53 0
|
算法 机器人 C语言
【二分查找】分巧克力、机器人跳跃、数的范围
开始准备蓝桥杯啦!这是计划的一部分,每天都会更新一个专题的内容,内容参考自acwing蓝桥杯辅导课,有兴趣的uu们也可以自行观看
108 0
|
5月前
|
人工智能 C++
组合+排列 以及伯努利装错信封问题思路
这段代码是C++实现的一个程序,用于计算从`n`个不同元素中选择`m`个进行排列的组合总数(排列问题)。用户输入`n`和`m`,程序通过循环和条件判断生成所有可能的排列,并输出排列的总数。核心逻辑是使用回溯法,当找到一个满足条件(不包含重复元素)的排列时,更新计数器并继续寻找下一个排列。
44 0
|
6月前
|
算法 测试技术 C#
【树 图论 阶乘 组合 深度优先搜索】1916. 统计为蚁群构筑房间的不同顺序
【树 图论 阶乘 组合 深度优先搜索】1916. 统计为蚁群构筑房间的不同顺序
|
6月前
|
算法 测试技术 C#
【二分图】【二分图最大匹配】LCP 04. 覆盖
【二分图】【二分图最大匹配】LCP 04. 覆盖