以下为力扣题友思路,以及本人代码
题目
小扣在秋日市集选择了一家早餐摊位,一维整型数组 staple 中记录了每种主食的价格,一维整型数组 drinks 中记录了每种饮料的价格。小扣的计划选择一份主食和一款饮料,且花费不超过 x 元。请返回小扣共有多少种购买方案。
注意:答案需要以 109 + 7 (1000000007) 为底取模,如:计算初始结果为 1000000008,请返回 1。
示例1
输入:staple = [10,20,5], drinks = [5,5,2], x = 15
输出:6
解释:小扣有 6 种购买方案,所选主食与所选饮料在数组中对应的下标分别是:
第 1 种方案:staple[0] + drinks[0] = 10 + 5 = 15;
第 2 种方案:staple[0] + drinks[1] = 10 + 5 = 15;
第 3 种方案:staple[0] + drinks[2] = 10 + 2 = 12;
第 4 种方案:staple[2] + drinks[0] = 5 + 5 = 10;
第 5 种方案:staple[2] + drinks[1] = 5 + 5 = 10;
第 6 种方案:staple[2] + drinks[2] = 5 + 2 = 7。
示例2
输入:staple = [2,1,1], drinks = [8,9,5,1], x = 9
输出:8
解释:小扣有 8 种购买方案,所选主食与所选饮料在数组中对应的下标分别是:
第 1 种方案:staple[0] + drinks[2] = 2 + 5 = 7;
第 2 种方案:staple[0] + drinks[3] = 2 + 1 = 3;
第 3 种方案:staple[1] + drinks[0] = 1 + 8 = 9;
第 4 种方案:staple[1] + drinks[2] = 1 + 5 = 6;
第 5 种方案:staple[1] + drinks[3] = 1 + 1 = 2;
第 6 种方案:staple[2] + drinks[0] = 1 + 8 = 9;
第 7 种方案:staple[2] + drinks[2] = 1 + 5 = 6;
第 8 种方案:staple[2] + drinks[3] = 1 + 1 = 2;
提示
- 1 <= staple.length <= 105
- 1 <= drinks.length <= 105
- 1 <= staple[i], drinks[i] <= 105
- 1 <= x <= 2*105
题友思路
我们用 arr[i] 表示食物里价格小于等于 i 的个数。然后遍历饮料,用 lt 表示买完饮料剩余的钱,即 lt = x - 当前饮料的价格。如果 lt<0,说明当前饮料的价格已经超过了上限,否则 arr[i] 表示的就说当前饮料可以和食物搭配的组合数。
本人代码
class Solution {
public int breakfastNumber(int[] staple, int[] drinks, int x) {
long ans = 0;
int[] arr = new int[x+1];
// 此处 arr[i] 中存放的是价格等于 i 的食物的个数
for (int i : staple)
if(i <= x)
arr[i] += 1;
// 此处 arr[i] 中存放的是价格小于等于 i 的食物的个数
for (int i=2; i<x; i++)
arr[i] += arr[i-1];
for (int i : drinks)
{
int lt = x - i;
if (lt < 0)
continue;
ans += arr[lt];
}
return (int)(ans%(1000000007));
}
}
复杂度分析
- 时间复杂度:O(n+m),其中 n 为 staple 的长度,m 为 drinks 的长度。
- 空间复杂度:O(1)。