1.早餐组合
题目:
小扣在秋日市集选择了一家早餐摊位,一维整型数组 staple 中记录了每种主食的价格,一维整型数组 drinks 中记录了每种饮料的价格。小扣的计划选择一份主食和一款饮料,且花费不超过 x 元。请返回小扣共有多少种购买方案。
注意:答案需要以 1e9 + 7 (1000000007) 为底取模,如:计算初始结果为:1000000008,请返回 1
思路:用暴力法的话很容易超时,所以要优化,
因为是不超过x元,很容易想到要先排序,然后遍历主食的数组,分别找到饮料的种类,然后累加。找到饮料的种类时,可以用二分法节约时间
/**
* @param {number[]} staple
* @param {number[]} drinks
* @param {number} x
* @return {number}
*/
var breakfastNumber = function(staple, drinks, x) {
const mod = Math.pow(10, 9) + 7;
staple.sort((a, b) => a - b);
drinks.sort((a, b) => a - b);
const l1 = staple.length;
const l2 = drinks.length;
let c = 0;
const map = new Map();
for (let i = 0; i < l1; i++) {
if (!map.has(staple[i])) {
map.set(staple[i], middle(l2, x - staple[i]) + 1);
}
c += map.get(staple[i]);
}
return c % mod;
function middle(l2, v) {
let left = 0;
let right = l2 - 1;
if (drinks[left] > v) return -1;
if (drinks[right] <= v) return l2 - 1;
while (left < right) {
const mid