青训营X豆包MarsCode 技术训练营刷题2 | 豆包MarsCode AI 刷题

67 阅读3分钟

小U的早餐选择计算

小U每天早上可以选择:

  1. 一份主食和一杯饮料。
  2. 只选择一份主食。
  3. 只选择一杯饮料。

我们给定两个数组:

  • staples:表示不同主食的价格。
  • drinks:表示不同饮料的价格。

每天的预算是 ( x ),我们需要计算出总花费不超过 ( x ) 的所有不同选择的数量。

输入:

  • staples:一个整数数组,表示不同主食的价格。
  • drinks:一个整数数组,表示不同饮料的价格。
  • x:一个整数,表示小U每天最多可以花费的金额。

输出:

  • 输出一个整数,表示小U每天早上可以选择的不同早餐组合的数量,满足总花费不超过 ( x )。

题解

问题分析

我们有两个数组,分别表示主食和饮料的价格。小U有以下几种选择:

  1. 选择一份主食和一杯饮料,前提是两者的总花费不超过 ( x )。
  2. 只选择一份主食,前提是主食的价格不超过 ( x )。
  3. 只选择一杯饮料,前提是饮料的价格不超过 ( x )。

思路

为了计算不同的选择方式,我们可以分步处理:

  1. 枚举所有主食的价格:对于每一份主食,检查是否符合 主食价格 <= x的条件。
  2. 枚举所有饮料的价格:对于每一杯饮料,检查是否符合 饮料价格 <= x的条件。
  3. 计算主食和饮料的组合:对于每一份主食,遍历所有饮料,检查总花费 主食价格 + 饮料价格 <= x 是否成立。如果成立,则这个组合有效。

解题步骤

  1. 初始化结果变量:用一个变量 count 来记录有效的选择数。
  2. 枚举主食和饮料的组合
    • 如果某一份主食和某一杯饮料的组合不超过预算 ( x ),则计数。
  3. 考虑仅选择主食或饮料:分别统计价格不超过 ( 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

代码解析

  1. 初始化计数器count 用于统计符合条件的早餐选择数量。
  2. 主食的选择:遍历 staples 数组,对于每一个主食,如果其价格小于等于 ( x ),则有效,计数加一。
  3. 饮料的选择:遍历 drinks 数组,对于每一杯饮料,如果其价格小于等于 ( x ),则有效,计数加一。
  4. 主食和饮料的组合:通过双重循环,遍历每一个主食和每一个饮料,检查它们的总和是否不超过 ( x )。如果符合条件,计数加一。
  5. 返回结果:最终返回计数器 count,即有效选择的数量。

时间复杂度分析

  • 遍历主食和饮料的组合时,双重循环的时间复杂度是 ( O(n * m) ),其中 ( n ) 是主食的数量,( m ) 是饮料的数量。
  • 因此,整体时间复杂度为 ( O(n * m) ),其中 ( n ) 和 ( m ) 分别是主食和饮料数组的长度。

优化思路

如果考虑到数组的规模非常大,可能会遇到性能瓶颈。为了优化,可以考虑:

  • 排序:可以对主食和饮料的数组进行排序,这样就可以利用双指针或二分搜索来加速组合计算,减少不必要的遍历。

例如,我们可以先遍历所有价格不超过 ( x ) 的主食和饮料的组合,然后再用一个双指针或者其他方法优化组合的查找速度。