【力扣】LCP 18. 早餐组合

以下为力扣题友思路,以及本人代码

题目

小扣在秋日市集选择了一家早餐摊位,一维整型数组 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. 1 <= staple.length <= 105
  2. 1 <= drinks.length <= 105
  3. 1 <= staple[i], drinks[i] <= 105
  4. 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)。

你可能感兴趣的:(力扣,leetcode,java)