问题描述
小C和小U一直相互喜欢着,今天他们终于有机会表达对彼此的心意。
有三个区间:[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
解题思路
-
需要考虑三对区间
[l1, r1]和[l2, r2]、[l1, r1]和[l3, r3]、[l2, r2]和[l3, r3] -
对于每对区间,首先计算它们的交集(交集的左端点不大于右端点)。
-
如果交集非空,取交集中的最大值,然后计算该最大值和其自身的和(因为小C和小U分别选择该数)。
-
在所有可能的区间对中,找出最大和。
-
如果没有任何有效的交集(即没有区间对的交集非空),返回
-1。
代码
int solution(int l1, int r1, int l2, int r2, int l3, int r3) {
int max_sum = -1; // 初始化最大和为-1,表示没有找到有效的交集
// 检查区间 [l1, r1] 和 [l2, r2] 的交集
if (max(l1, l2) <= min(r1, r2)) {
int intersect1 = min(r1, r2);
max_sum = max(max_sum, intersect1 + intersect1);
}
// 检查区间 [l1, r1] 和 [l3, r3] 的交集
if (max(l1, l3) <= min(r1, r3)) {
int intersect2 = min(r1, r3);
max_sum = max(max_sum, intersect2 + intersect2);
}
// 检查区间 [l2, r2] 和 [l3, r3] 的交集
if (max(l2, l3) <= min(r2, r3)) {
int intersect3 = min(r2, r3);
max_sum = max(max_sum, intersect3 + intersect3);
}
return max_sum; // 返回最大和,如果没有交集则返回-1
}
复杂度分析
时间复杂度为 O(3),即常数时间,具体是三个区间对的交集计算
空间复杂度为 O(1)