伴学笔记4| 豆包MarsCode AI刷题

136 阅读4分钟

学习方法和心得:区间合并与计数问题

问题分析

在给定多个递增的数字范围时,我们的目标是合并这些范围,并计算合并后的唯一数字个数。这个问题本质上是一个区间合并与去重的计数问题,涉及到的主要操作是:

  1. 合并重叠区间:多个区间可能会有重叠,合并时需要避免重复计数。
  2. 计数唯一数字:合并后的区间不应重复计数其中的数字,应该计算这些区间内所有唯一的数字。

学习步骤

  1. 理解问题的核心

    • 给定多个区间 [a, b],首先需要判断这些区间是否有交集。如果有交集,我们应该将它们合并为一个更大的区间。
    • 合并后的区间可以通过计算每个区间的数字个数来得到唯一的数字数目。
  2. 思路概述

    • 排序:首先对所有区间的起始值进行排序。排序后,相邻区间如果有交集,就可以直接合并,否则保持不变。
    • 合并区间:遍历排序后的区间,判断当前区间是否与前一个区间重叠。如果重叠,就合并;如果不重叠,则记录当前区间并继续处理下一个区间。
    • 计算唯一数字:在合并后的区间上,直接计算每个区间的长度。
  3. 具体步骤

    • 对所有区间按照起始位置排序。

    • 初始化一个空的合并区间列表。

    • 遍历排序后的区间:

      • 如果当前区间与最后一个合并区间有重叠,就将其合并。
      • 如果没有重叠,就将当前区间直接添加到合并区间列表。
    • 最终,通过合并后的区间计算总的唯一数字数目。

代码实现

def count_points(inputArray):
    # 首先根据区间的起始位置对输入进行排序
    inputArray.sort()

    # 初始化合并后的区间列表
    merged_intervals = []
    
    for interval in inputArray:
        # 如果合并区间列表为空,或者当前区间与最后一个合并区间没有重叠,直接添加
        if not merged_intervals or merged_intervals[-1][1] < interval[0]:
            merged_intervals.append(interval)
        else:
            # 如果有重叠,合并区间
            merged_intervals[-1][1] = max(merged_intervals[-1][1], interval[1])
    
    # 计算合并后的区间内的数字总个数
    total_points = 0
    for interval in merged_intervals:
        total_points += interval[1] - interval[0] + 1
    
    return total_points

代码解释

  1. 排序:首先,我们通过 inputArray.sort() 对所有的区间进行排序。排序依据是每个区间的起始值,这样便于我们后续判断相邻区间是否有重叠。

  2. 合并区间

    • 我们遍历排序后的区间,依次检查当前区间是否与已经合并的最后一个区间有重叠。
    • 如果有重叠,就合并当前区间和最后一个区间,将最后一个区间的结束位置更新为当前区间结束位置的较大者。
    • 如果没有重叠,就将当前区间添加到合并区间列表中。
  3. 计算唯一数字:合并后的区间不再重叠,直接计算每个区间的长度,最后返回所有区间长度的和。

示例分析

示例 1

输入:

python
复制代码
inputArray = [[1, 4], [7, 10], [3, 5]]
  1. 排序后的区间:[[1, 4], [3, 5], [7, 10]]

  2. 合并过程:

    • [1, 4] 和 [3, 5] 有重叠,合并为 [1, 5]
    • [1, 5] 和 [7, 10] 没有重叠,保持不变
  3. 合并后的区间:[[1, 5], [7, 10]]

  4. 唯一数字个数:(5 - 1 + 1) + (10 - 7 + 1) = 5 + 4 = 9

输出:9

示例 2

输入:

python
复制代码
inputArray = [[1, 2], [6, 10], [11, 15]]
  1. 排序后的区间:[[1, 2], [6, 10], [11, 15]]

  2. 合并过程:

    • 无重叠,直接添加
  3. 合并后的区间:[[1, 2], [6, 10], [11, 15]]

  4. 唯一数字个数:(2 - 1 + 1) + (10 - 6 + 1) + (15 - 11 + 1) = 2 + 5 + 5 = 12

输出:12

示例 3

输入:

python
复制代码
inputArray = [[1, 3], [2, 6], [8, 10]]
  1. 排序后的区间:[[1, 3], [2, 6], [8, 10]]

  2. 合并过程:

    • [1, 3] 和 [2, 6] 有重叠,合并为 [1, 6]
    • [1, 6] 和 [8, 10] 没有重叠,保持不变
  3. 合并后的区间:[[1, 6], [8, 10]]

  4. 唯一数字个数:(6 - 1 + 1) + (10 - 8 + 1) = 6 + 3 = 9

输出:9

总结与心得

  • 合并区间的核心思路:通过排序和遍历,简洁地解决了区间合并问题。合并过程中,我们要特别注意区间是否有重叠。
  • 效率与优化:这个解法的时间复杂度是 O(nlog⁡n)O(nlogn),其中 nn 是区间的数量,排序的时间复杂度占主导地位。对于大规模的数据集,这种效率已经足够高。
  • 应用场景:此类问题在许多实际问题中都有应用,例如日程安排、事件处理等,理解和掌握这类问题的解决方法能够帮助我们处理复杂的数据合并与计数问题。