刷题笔记 1 小C和小U | 豆包MarsCode AI刷题

38 阅读2分钟

问题描述

小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)