青训营笔记11 | 豆包MarsCode AI刷题

103 阅读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

思路

  • 小C和小U分别从三个区间中选择一个区间,并且这两个区间不能相同。
  • 他们各自在自己的区间内选择一个数,并且这个数还要能够在对方的区间内找到。
  • 目标是找到这两个数的和的最大值。

步骤

  1. 区间选择
  • 由于只有三个区间,我们可以通过枚举的方式来选择两个不同的区间。
  • 具体来说,我们可以选择第一个区间和第二个区间,第一个区间和第三个区间,以及第二个区间和第三个区间。
  1. 数的选择
  • 对于每一对选择的区间,我们需要找到一个数在第一个区间内,并且这个数也在第二个区间内。
  • 为了最大化两个数的和,我们可以从每个区间的最大值开始尝试,逐步减小,直到找到一个满足条件的数。
  1. 计算和
  • 对于每一对区间,计算满足条件的两个数的和,并记录最大值。
  1. 返回结果
  • 如果没有找到任何满足条件的数对,返回 -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

分析

  • 时间复杂度

    • 区间选择:由于只有三个区间,枚举所有可能的区间对的时间复杂度为 O(1)O(1)
    • 数的选择:在最坏情况下需要遍历两个区间的所有可能数对。假设每个区间的长度为 n,则时间复杂度为 O(n2)O(n^2)
    • 总体时间复杂度为 O(n^2),其中 n 是区间的长度。
  • 空间复杂度

    • 只使用了常数级别的额外空间来存储变量和函数调用栈,因此空间复杂度为 O(1)O(1)