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)\)
posted @ 2020-09-13 20:25  童年の波鞋  阅读(171)  评论(0编辑  收藏  举报