小U的早餐选择计算
小U每天早上可以选择:
- 一份主食和一杯饮料。
- 只选择一份主食。
- 只选择一杯饮料。
我们给定两个数组:
staples:表示不同主食的价格。drinks:表示不同饮料的价格。
每天的预算是 ( x ),我们需要计算出总花费不超过 ( x ) 的所有不同选择的数量。
输入:
staples:一个整数数组,表示不同主食的价格。drinks:一个整数数组,表示不同饮料的价格。x:一个整数,表示小U每天最多可以花费的金额。
输出:
- 输出一个整数,表示小U每天早上可以选择的不同早餐组合的数量,满足总花费不超过 ( x )。
题解
问题分析
我们有两个数组,分别表示主食和饮料的价格。小U有以下几种选择:
- 选择一份主食和一杯饮料,前提是两者的总花费不超过 ( x )。
- 只选择一份主食,前提是主食的价格不超过 ( x )。
- 只选择一杯饮料,前提是饮料的价格不超过 ( x )。
思路
为了计算不同的选择方式,我们可以分步处理:
- 枚举所有主食的价格:对于每一份主食,检查是否符合
主食价格<= x的条件。 - 枚举所有饮料的价格:对于每一杯饮料,检查是否符合
饮料价格<= x的条件。 - 计算主食和饮料的组合:对于每一份主食,遍历所有饮料,检查总花费
主食价格+饮料价格<= x 是否成立。如果成立,则这个组合有效。
解题步骤
- 初始化结果变量:用一个变量
count来记录有效的选择数。 - 枚举主食和饮料的组合:
- 如果某一份主食和某一杯饮料的组合不超过预算 ( x ),则计数。
- 考虑仅选择主食或饮料:分别统计价格不超过 ( x ) 的主食和饮料的数量。
代码实现
def breakfastChoices(staples, drinks, x):
count = 0
# 1. 统计所有主食价格小于等于 x 的选项数
for staple in staples:
if staple <= x:
count += 1
# 2. 统计所有饮料价格小于等于 x 的选项数
for drink in drinks:
if drink <= x:
count += 1
# 3. 统计主食和饮料的所有有效组合数
for staple in staples:
for drink in drinks:
if staple + drink <= x:
count += 1
return count
# 测试用例
print(breakfastChoices([5, 20, 5], [5, 5, 2], 5)) # 输出 5
print(breakfastChoices([3, 10, 7], [2, 5], 7)) # 输出 5
print(breakfastChoices([10, 15], [5, 6], 20)) # 输出 7
代码解析
- 初始化计数器:
count用于统计符合条件的早餐选择数量。 - 主食的选择:遍历
staples数组,对于每一个主食,如果其价格小于等于 ( x ),则有效,计数加一。 - 饮料的选择:遍历
drinks数组,对于每一杯饮料,如果其价格小于等于 ( x ),则有效,计数加一。 - 主食和饮料的组合:通过双重循环,遍历每一个主食和每一个饮料,检查它们的总和是否不超过 ( x )。如果符合条件,计数加一。
- 返回结果:最终返回计数器
count,即有效选择的数量。
时间复杂度分析
- 遍历主食和饮料的组合时,双重循环的时间复杂度是 ( O(n * m) ),其中 ( n ) 是主食的数量,( m ) 是饮料的数量。
- 因此,整体时间复杂度为 ( O(n * m) ),其中 ( n ) 和 ( m ) 分别是主食和饮料数组的长度。
优化思路
如果考虑到数组的规模非常大,可能会遇到性能瓶颈。为了优化,可以考虑:
- 排序:可以对主食和饮料的数组进行排序,这样就可以利用双指针或二分搜索来加速组合计算,减少不必要的遍历。
例如,我们可以先遍历所有价格不超过 ( x ) 的主食和饮料的组合,然后再用一个双指针或者其他方法优化组合的查找速度。