思路概述
-
区间关系分析:
-
给定的每对区间之间是独立的,我们需要从两个区间中各自选择一个数,并且这两个数要满足互相的“包含关系”。也就是说:
- 数
num1必须在第二个区间内,即num1应该大于等于区间2的左端点l2,并且小于等于区间2的右端点r2。 - 数
num2必须在第一个区间内,即num2应该大于等于区间1的左端点l1,并且小于等于区间1的右端点r1。
- 数
-
-
最大和的求解:
- 从每对符合条件的数中计算其和,然后找到其中的最大值。
-
遍历所有可能的组合:
- 由于有三个区间,我们可以考虑对每一对区间进行遍历,选取不同区间中的数。
- 由于最大值求解涉及多个区间的数值组合,因此需要检查每对区间的交集(即区间值互相重叠的部分)。
代码解析
java
public class Main {
public static int solution(int l1, int r1, int l2, int r2, int l3, int r3) {
// 定义一个变量来存储最大和,初始值为-1
int maxSum = -1;
// 定义一个数组来存储所有区间
int[][] intervals = {{l1, r1}, {l2, r2}, {l3, r3}};
// 遍历所有可能的区间组合
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i != j) { // 确保区间 i 和区间 j 是不同的
// 获取当前的两个区间
int[] interval1 = intervals[i];
int[] interval2 = intervals[j];
// 在区间1中选择一个数
for (int num1 = interval1[0]; num1 <= interval1[1]; num1++) {
// 在区间2中选择一个数
for (int num2 = interval2[0]; num2 <= interval2[1]; num2++) {
// 检查num1是否在区间2中,num2是否在区间1中
if (num1 >= interval2[0] && num1 <= interval2[1] &&
num2 >= interval1[0] && num2 <= interval1[1]) {
// 计算和并更新最大值
maxSum = Math.max(maxSum, num1 + num2);
}
}
}
}
}
}
// 返回最大和
return maxSum;
}
public static void main(String[] args) {
System.out.println(solution(1, 3, 2, 4, 4, 6) == 8);
System.out.println(solution(1, 2, 2, 3, 3, 4) == 6);
System.out.println(solution(10, 20, 15, 25, 30, 40) == 40);
}
}
1. solution 方法解析
输入参数:
l1, r1:第一个区间的左右端点;l2, r2:第二个区间的左右端点;l3, r3:第三个区间的左右端点。
步骤:
maxSum:用于存储最大和,初始化为-1,代表尚未找到符合条件的结果。intervals:一个二维数组,包含三个区间的起始和结束值。
接下来,程序用两层嵌套循环来遍历不同区间的组合:
- 外层两层循环遍历所有不同的区间组合(
i != j确保选择的两个区间不同)。
对于每一对不同区间 interval1 和 interval2,程序进一步遍历每个区间内的所有整数:
- 第一层循环:
num1遍历区间interval1中的所有数值; - 第二层循环:
num2遍历区间interval2中的所有数值。
条件判断:
- 在循环内部,程序检查
num1是否在interval2区间内(num1 >= interval2[0] && num1 <= interval2[1])。 - 同时,检查
num2是否在interval1区间内(num2 >= interval1[0] && num2 <= interval1[1])。
如果上述条件成立,就计算 num1 + num2 的值,并更新 maxSum 为当前最大值。
最后返回 maxSum。
2. main 方法解析
main 方法用于测试 solution 方法,使用了三组测试用例:
java
System.out.println(solution(1, 3, 2, 4, 4, 6) == 8); // 期待输出 true
System.out.println(solution(1, 2, 2, 3, 3, 4) == 6); // 期待输出 true
System.out.println(solution(10, 20, 15, 25, 30, 40) == 40); // 期待输出 true
代码执行过程
1. 第一个测试用例:solution(1, 3, 2, 4, 4, 6)
- 区间1
[1, 3] - 区间2
[2, 4] - 区间3
[4, 6]
通过遍历区间的组合,找出符合条件的数对:
- 区间1 和 区间2 的组合:
num1为 2、3,num2为 2、3、4。 - 区间1 和 区间3 的组合:
num1为 3,num2为 4、5、6。
最大和:3 + 5 = 8。
2. 第二个测试用例:solution(1, 2, 2, 3, 3, 4)
- 区间1
[1, 2] - 区间2
[2, 3] - 区间3
[3, 4]
最大和:2 + 4 = 6。
3. 第三个测试用例:solution(10, 20, 15, 25, 30, 40)
- 区间1
[10, 20] - 区间2
[15, 25] - 区间3
[30, 40]
最大和:20 + 20 = 40。
总结
通过穷举所有区间组合及其元素,逐步找出满足条件的数对,并计算出其中的最大和。由于区间数量固定为3个,因此该算法的复杂度是 O(3^2 * n^2),其中 n 是每个区间的长度。虽然效率不算非常高,但在实际使用中,可以适应小范围的输入。