早餐组合----java
小扣在秋日市集选择了一家早餐摊位,一维整型数组 staple 中记录了每种主食的价格,一维整型数组 drinks 中记录了每种饮料的价格。小扣的计划选择一份主食和一款饮料,且花费不超过 x 元。请返回小扣共有多少种购买方案。
注意:答案需要以 1e9 + 7 (1000000007) 为底取模,如:计算初始结果为:1000000008,请返回 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/2vYnGI
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
首先我们可以使用双指针的形式,一个指向staple,一个指向drinks尾下标,并对数组进行排序,如果staple[i]和drinks[j]<x,那么说明j的drinks长度就是一组方案
程序运行过程:
staple[10,20,5]
drinks[5,5,2]
x=15
res=0
i=0;j=2,res=3
i=1;j=2,res=6
i=2;j=2;j=1;j=0;j=-1;res=6
class Solution {
public int breakfastNumber(int[] staple, int[] drinks, int x) {
Arrays.sort(staple); //对数组进行有序排序
Arrays.sort(drinks);
int res=0; //从头开始当下标
int j=drinks.length-1; //从尾开始当下标,这样如果尾j符合,那么说明drinks.length的长度就是其中一组方案数
for(int i=0;i<staple.length;i++) {
if(j<0) break; //排除特殊情况
while(j>=0&&staple[i]+drinks[j]>x) { //当大于0或者,两个数组的下标指向+起来大于x
j--;
}
res=(res+(j+1))%1000000007; //小于的情况
}
return res%1000000007;
}
}