问题描述
小C何小U
小C和小U一直相互喜欢着,今天他们终于有机会表达对彼此的心意。
小C有三个区间:[l_1, r_1], [l_2, r_2], 和 [l_3, r_3]。小C和小U将分别从这些区间中选择一个自己最喜欢的区间,但这两个区间不能相同。
接着,他们会在自己喜欢的区间内选择一个数,并且这个数还要能够在对方的区间内找到。为了讨对方欢心,他们希望选择的两个数的和尽可能大。
你的任务是帮助小C和小U找到这两个数的和的最大值。如果不存在这样的两个数,输出 -1。
测试样例
样例1:
输入:
l1 = 1, r1 = 3, l2 = 2, r2 = 4, l3 = 4, r3 = 6
输出:8
样例2:
输入:
l1 = 1, r1 = 2, l2 = 2, r2 = 3, l3 = 3, r3 = 4
输出:6
样例3:
输入:
l1 = 10, r1 = 20, l2 = 15, r2 = 25, l3 = 30, r3 = 40
输出:40
思路
- 小C和小U分别从三个区间中选择一个区间,并且这两个区间不能相同。
- 他们各自在自己的区间内选择一个数,并且这个数还要能够在对方的区间内找到。
- 目标是找到这两个数的和的最大值。
步骤
- 区间选择:
- 由于只有三个区间,我们可以通过枚举的方式来选择两个不同的区间。
- 具体来说,我们可以选择第一个区间和第二个区间,第一个区间和第三个区间,以及第二个区间和第三个区间。
- 数的选择:
- 对于每一对选择的区间,我们需要找到一个数在第一个区间内,并且这个数也在第二个区间内。
- 为了最大化两个数的和,我们可以从每个区间的最大值开始尝试,逐步减小,直到找到一个满足条件的数。
- 计算和:
- 对于每一对区间,计算满足条件的两个数的和,并记录最大值。
- 返回结果:
- 如果没有找到任何满足条件的数对,返回
-1。 - 否则,返回找到的最大和。
实现
def solution(l1: int, r1: int, l2: int, r2: int, l3: int, r3: int) -> int:
# 检查两个区间是否有交集
def has_intersection(l1, r1, l2, r2):
return max(l1, l2) <= min(r1, r2)
# 计算两个区间交集的最大和
def max_sum_in_intersection(l1, r1, l2, r2):
for x in range(r1, l1-1, -1):
if l2 <= x <= r2:
for y in range(r2, l2-1, -1):
if l1 <= y <= r1:
return x + y
return -1
# 初始化最大和为-1
max_sum = -1
# 检查所有可能的区间对
if has_intersection(l1, r1, l2, r2):
max_sum = max(max_sum, max_sum_in_intersection(l1, r1, l2, r2))
if has_intersection(l1, r1, l3, r3):
max_sum = max(max_sum, max_sum_in_intersection(l1, r1, l3, r3))
if has_intersection(l2, r2, l3, r3):
max_sum = max(max_sum, max_sum_in_intersection(l2, r2, l3, r3))
return max_sum
分析
-
时间复杂度:
- 区间选择:由于只有三个区间,枚举所有可能的区间对的时间复杂度为 。
- 数的选择:在最坏情况下需要遍历两个区间的所有可能数对。假设每个区间的长度为 n,则时间复杂度为 。
- 总体时间复杂度为 O(n^2),其中 n 是区间的长度。
-
空间复杂度:
- 只使用了常数级别的额外空间来存储变量和函数调用栈,因此空间复杂度为 。