⭐算法入门⭐《二分枚举》简单15 —— LeetCode LCP 18. 早餐组合
文章目录
- 一、题目
- 1、题目描述
- 2、基础框架
- 3、原题链接
- 二、解题报告
- 1、思路分析
- 2、时间复杂度
- 3、代码详解
- 三、本题小知识
- 四、加群须知
一、题目
1、题目描述
小扣在秋日市集选择了一家早餐摊位,一维整型数组 staple 中记录了每种主食的价格,一维整型数组 drinks 中记录了每种饮料的价格。小扣的计划选择一份主食和一款饮料,且花费不超过 xxx 元。请返回小扣共有多少种购买方案。
样例输入:staple = [10,20,5], drinks = [5,5,2], x = 15
样例输出:6
2、基础框架
- C语言 版本给出的基础框架代码如下:
int breakfastNumber(int* staple, int stapleSize, int* drinks, int drinksSize, int x){}
3、原题链接
LeetCode LCP 18. 早餐组合
二、解题报告
1、思路分析
1)首先,对 drinks 数组进行递增排序;
2)枚举 staple 其中一个 iii,记为 now=staple[i]now = staple[i]now=staple[i];
3)目标是找到 now+drinks[j]≤xnow + drinks[j] \le xnow+drinks[j]≤x 的最大的 jjj,所以这里我们可以令 drinks[j]≤x−nowdrinks[j] \le x - nowdrinks[j]≤x−now 为红色部分,drinks[j]>x−nowdrinks[j] \gt x - nowdrinks[j]>x−now 为绿色部分;
4)利用二分枚举找到红色的右边界 rrr,累加 r+1r + 1r+1;
2、时间复杂度
总的时间复杂度为 O(nlog2n)O(nlog_2n)O(nlog2n)。
3、代码详解
/************** 二分查找 数组 模板 **************/
/*1)传参的数组满足:红红红红红红红红绿绿绿绿绿绿绿; 2)返回值:绿色区段的左边界;
*/int isGreen(int val, int x);int binarySearch(int *arr, int arrSize, int x) {int l = -1, r = arrSize;int mid;while(l + 1 < r) {mid = l + (r - l) / 2;if( isGreen(arr[mid], x) )r = mid;elsel = mid;}return r;
}
/************** 二分查找 数组 模板 **************/int isGreen(int val, int x) {return val > x;
}#define mod 1000000007int cmp(const void *a, const void *b) {return *((int *)a) - *((int *)b);
}
int breakfastNumber(int* staple, int stapleSize, int* drinks, int drinksSize, int x){int i, r, sum = 0;qsort(drinks, drinksSize, sizeof(int), cmp); // (1)for(i = 0; i < stapleSize; ++i) { // (2)r = binarySearch(drinks, drinksSize, x - staple[i]); // (3)sum += r; // (4)if(sum >= mod) sum -= mod; // (5)}return sum;
}
- (1)(1)(1) 排序,让饮料有序;
- (2)(2)(2) 线性枚举主食;
- (3)(3)(3) 寻找满足最大的饮料编号;
- (4)(4)(4) 加上饮料个数;
- (5)(5)(5) 取模;
三、本题小知识
线性枚举配合二分枚举是一般解题的常用手段。
四、加群须知
相信看我文章的大多数都是「 大学生 」,能上大学的都是「 精英 」,那么我们自然要「 精益求精 」,如果你还是「 大一 」,那么太好了,你拥有大把时间,当然你可以选择「 刷剧 」,然而,「 学好算法 」,三年后的你自然「 不能同日而语 」。
那么这里,我整理了「 几十个基础算法 」 的分类,点击开启:
小扣在秋日市集选择了一家早餐摊位,一维整型数组 staple 中记录了每种主食的价格,一维整型数组 drinks 中记录了每种饮料的价格.小扣的计划选择一份主食和一款饮料,且花费不超过 x 元.请返回 ... 1. 题目 小扣在秋日市集选择了一家早餐摊位,一维整型数组 staple 中记录了每种主食的价格,一维整型数组 drinks 中记录了每种饮料的价格.小扣的计划选择一份主食和一款饮料,且花费不超过 x ... 题目 注意:答案需要以 1e9 + 7 (1000000007) 为底取模,如:计算初始结果为:1000000008,请返回 1 提示: 1 <= staple.length <= 10^ ... 小扣在秋日市集选择了一家早餐摊位,一维整型数组 staple 中记录了每种主食的价格,一维整型数组 drinks 中记录了每种饮料的价格.小扣的计划选择一份主食和一款饮料,且花费不超过 x 元.请返回 ... 小扣在秋日市集选择了一家早餐摊位,一维整型数组 staple 中记录了每种主食的价格,一维整型数组 drinks 中记录了每种饮料的价格.小扣的计划选择一份主食和一款饮料,且花费不超过 x 元.请返回 ... LCP 18. 早餐组合 小扣在秋日市集选择了一家早餐摊位,一维整型数组 staple 中记录了每种主食的价格,一维整型数组 drinks 中记录了每种饮料的价格.小扣的计划选择一份主食和一款饮料,且 ... 大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ... 作者:dorseyCh来源:http://www.imooc.com/article/264180 很久之前有过一次面试,被问到一个问题,能不能写一个冒泡排序?说实话,尽管在这之前曾经写过不少比这个更 ... 有一个同学在学习分式.他需要将一个连分数化成最简分数,你能帮助他吗? 连分数是形如上图的分式.在本题中,所有系数都是大于等于0的整数. 输入的cont代表连分数的系数(cont[0]代表上图的a0,以 ...⭐算法入门⭐《二分枚举》简单15 —— LeetCode LCP 18. 早餐组合相关推荐
最新文章
热门文章