【力扣】LCP 18. 早餐組合
阿新 • • 發佈:2021-02-02
以下為力扣題友思路,以及本人程式碼
題目
小扣在秋日市集選擇了一家早餐攤位,一維整型陣列 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 <= staple.length <= 105
- 1 <= drinks.length <= 105
- 1 <= staple[i], drinks[i] <= 105
- 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)。