c_lc_早餐组合(排序+双指针)
小扣在秋日市集选择了一家早餐摊位,一维整型数组 staple 中记录了每种主食的价格,一维整型数组 drinks 中记录了每种饮料的价格。小扣的计划选择一份主食和一款饮料,且花费不超过 x 元。请返回小扣共有多少种购买方案。
注意:答案需要以 1e9 + 7 (1000000007) 为底取模
提示:
1 <= staple.length <= 10^5
1 <= drinks.length <= 10^5
方法一:排序+双指针
这题第一感觉就是排序,固定 staple 的某个位置,然后从后往前遍历 drinks,找到符合条件的最后一个位置 j,对答案的贡献就是 j+1
感觉数据没有卡这个算法,如果每次都遍历了一遍 drinks 算法会变成 O(nm),铁定超时
class Solution {
public:
int breakfastNumber(vector<int>& s, vector<int>& d, int x) {
int n=s.size(), m=d.size(), ans=0, mod=1e9+7;
sort(s.begin(), s.end());
sort(d.begin(), d.end());
int j=m-1;
for (int i=0; i<n; i++) {
while (j>=0 && s[i]+d[j]>x) j--;
if (j==-1) break;
ans=(ans+j+1)%mod;
}
return ans;
}
};
复杂度分析
- Time:\(O(nlogn)\),
- Space:\(O(1)\),