1. 程式人生 > 其它 >【力扣】LCP 18. 早餐組合

【力扣】LCP 18. 早餐組合

技術標籤:力扣leetcodejava

以下為力扣題友思路,以及本人程式碼

題目

小扣在秋日市集選擇了一家早餐攤位,一維整型陣列 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)。