问题描述
小F正在开发一个推荐系统,该系统使用多个模型来预估不同的目标指标(如点击率和观看时长)。为了有效地融合这些指标,系统对每个目标提供了两种不同的变换方式,每种方式会产生一个变换值。小F的任务是为每个目标选择其中一种变换方式,然后将所有选中的变换值相乘,得到最终的融合结果。
然而,不同的选择组合可能会导致最终结果值过大或过小。因此,小F希望计算出在给定的合理区间 [L,R][L,R] 内,有多少种不同的选择组合可以使最终的融合结果落在这个区间内。
输入说明
n
:目标指标的数量f
:一个二维数组,其中f[i]
表示第 i 个目标的两种变换值L
:期望结果的下界R
:期望结果的上界
取值范围
- 1 ≤ n ≤ 20
- 1 ≤ f[i][j] ≤ 10^9
- 1 ≤ L ≤ R ≤ 10^9
输出说明
输出一个整数,表示使最终融合结果落在区间 [L,R][L,R] 内的选择组合数量。
题目理解
小F的任务是为每个目标选择其中一种变换方式,然后将所有选中的变换值相乘,得到最终的融合结果。我们需要计算出在给定的合理区间 [L,R] 内,有多少种不同的选择组合可以使最终的融合结果落在这个区间内。
数据结构选择
根据题目分析我们可以选择以下的数据结构
-
输入:
n
:目标指标的数量。f
:一个二维数组,其中f[i]
表示第i
个目标的两种变换值。L
:期望结果的下界。R
:期望结果的上界。
-
输出:
- 一个整数,表示使最终融合结果落在区间 [L,R] 内的选择组合数量。
算法步骤
-
初始化计数器:
- 使用一个变量
count
来记录满足条件的组合数量。
- 使用一个变量
-
递归遍历所有组合:
- 使用深度优先搜索(DFS)来遍历所有可能的组合。
- 对于每个目标,有两种选择(选择第一种变换值或第二种变换值),因此需要递归地处理这两种选择。
-
递归终止条件:
- 当遍历完所有目标时(即
index == n
),检查当前乘积是否在区间 [L,R] 内。 - 如果在区间内,则增加计数器
count
。
- 当遍历完所有目标时(即
-
递归调用:
-
递归调用
dfs
函数来处理当前目标的两种变换值。
-
总结收获
通过解决这个推荐系统中的组合选择问题,我深刻体会到了递归在处理组合问题中的强大作用。递归不仅能够帮助我们系统地遍历所有可能的组合,还能在每一步中进行条件判断,从而高效地筛选出满足特定条件的组合。在这个过程中,我学会了如何通过递归函数来构建复杂的逻辑结构,并且在递归终止时进行结果的汇总和判断。此外,我还意识到了在处理大规模组合问题时,时间复杂度的考量至关重要。尽管递归方法在处理小规模问题时表现出色,但在面对更大规模的数据时,可能需要考虑更优化的算法或数据结构来提高效率。总的来说,这次练习不仅提升了我的编程技能,也让我对算法设计和复杂度分析有了更深入的理解。
代码
def solution(n: int, f: list[list[int]], L: int, R: int) -> int:
# 初始化计数器
count = 0
# 定义递归函数来遍历所有组合
def dfs(index, current_product):
# 如果已经遍历完所有目标
if index == n:
# 检查当前乘积是否在区间 [L, R] 内
if L <= current_product <= R:
nonlocal count
count += 1
return
# 递归遍历当前目标的两种变换值
dfs(index + 1, current_product * f[index][0])
dfs(index + 1, current_product * f[index][1])
# 从第一个目标开始递归
dfs(0, 1)
return count
if __name__ == "__main__":
print(solution(3, [[1, 2], [3, 4]], 1, 6))
print(solution(2, [[1, 2], [3, 4]], 4, 6))
print(solution(3, [[1, 2], [3, 5], [2, 4]], 10, 50))