青训营X豆包MarsCode 技术训练营 字节青训营笔记4| 豆包MarsCode AI刷题

64 阅读3分钟

小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

问题分析

此问题是区间交集问题,要求找出三个区间中任意两个区间的交集的最大值,并计算相应的和。

在给定的三个区间 [l1, r1], [l2, r2], [l3, r3] 中挑选出两个不相同的区间,使得它们的交集非空,在交集区间中选择一个数,使得两个选择的数之和最大。

step1:求任意两个区间 [l1, r1] [l2, r2] 区间交集

  1.   交集的左端点是 max(l1, l2),交集的右端点是 min(r1, r2)
  1.   如果 max(l1, l2) <= min(r1, r2),交集存在,交集的最大值为 min(r1, r2)
  1.   如果 max(l1, l2) > min(r1, r2),交集不存在。

  具体实现:定义交集计算函数, 定义auto getIntersectionMax = [](int a1, int b1, int a2, int b2) {...},采用 Lambda 表达式的基本结构。auto 关键字:表示编译器自动推导 lambda 表达式的返回类型。getIntersectionMax 是 lambda 表达式的名称。[](int a1, int b1, int a2, int b2) {...} 是 lambda 表达式的主体部分。来计算两个区间的交集最大值。

step2:计算最大和

对于每一对区间交集存在的情况,选择交集区间中的最大值,计算两个数的和。目标是选取两个区间的交集并使其和最大。maxSum = max(maxSum, inter1 + inter1);

step3:考虑所有可能的区间组合

有三个区间 [l1, r1], [l2, r2], [l3, r3]

可以通过循环枚举的方式,遍历所有组合,检查所有可能的两两区间组合,计算交集并更新最大和。

返回结果,计算交集的最大值和其自身的和,比较所有可能组合的和,输出最大值。最终输出最大和,如果没有找到交集,则输出 -1

代码如下:

#include <iostream>
#include <algorithm>
using namespace std;

int solution(int l1, int r1, int l2, int r2, int l3, int r3) {
    int maxSum = -1;
    
    // 检查区间 [a1, b1][a2, b2] 是否有交集
    auto getIntersectionMax = [](int a1, int b1, int a2, int b2) {
        int a = max(a1, a2);
        int b = min(b1, b2);
        if (a <= b) return b;  
        return -1;  // 如果没有交集,返回 -1
    };
    
    //[l1, r1][l2, r2]
    int inter1 = getIntersectionMax(l1, r1, l2, r2);
    if (inter1 != -1) {
        maxSum = max(maxSum, inter1 + inter1);  
    }
    //[l1, r1][l3, r3]
    int inter2 = getIntersectionMax(l1, r1, l3, r3);
    if (inter2 != -1) {
        maxSum = max(maxSum, inter2 + inter2);  
    }
    //[l2, r2][l3, r3]
    int inter3 = getIntersectionMax(l2, r2, l3, r3);
    if (inter3 != -1) {
        maxSum = max(maxSum, inter3 + inter3);  
    }
    return maxSum;  // 返回最大和,如果没有找到交集返回 -1
}

int main() {
    // 测试样例
    cout << (solution(1, 3, 2, 4, 4, 6) == 8) << endl;  // 8
    cout << (solution(1, 2, 2, 3, 3, 4) == 6) << endl;  // 6
    cout << (solution(10, 20, 15, 25, 30, 40) == 40) << endl;  // 40
}