青训营X豆包MarsCode 技术训练营第三课 | 豆包MarsCode AI 刷题

55 阅读3分钟

学习日记:合并区间并计算唯一数字的个数

题目解析

这道题目要求我们计算多个递增的数字范围(区间)合并后的唯一数字个数。具体来说,给定一系列的数字区间,我们需要:

  1. 合并所有重叠的区间;
  2. 计算所有唯一数字的个数。

例如,给定区间 [[1, 4], [7, 10], [3, 5]],这些区间合并后会变成 [[1, 5], [7, 10]],然后计算其中的唯一数字个数,结果是 9。

关键思路:

  1. 区间合并:多个区间可能会有重叠部分,合并后我们需要确保同一数字不被计算两次。
  2. 计数:合并后的每个区间计算其中的数字个数,通过 end - start + 1 来计算一个区间内的数字数量。

解题思路

  1. 排序:首先,我们需要对所有区间按起始值进行排序。排序后,方便我们依次检查并合并区间。
  2. 合并区间:遍历排序后的区间,如果当前区间的起始值小于等于上一个区间的结束值,则这两个区间重叠,可以合并;否则,将当前区间添加为新的区间。
  3. 计算唯一数字个数:合并后的每个区间的数字个数通过 end - start + 1 来计算,累加得到总数。

代码实现

def solution(inputArray): # Step 1: Sort the intervals based on their start value inputArray.sort(key=lambda x: x[0])

# Step 2: Merge the intervals
merged_intervals = []

for interval in inputArray:
    if not merged_intervals:
        merged_intervals.append(interval)
    else:
        last = merged_intervals[-1]
        if last[1] >= interval[0]:
            # If the intervals overlap, merge them by updating the end
            merged_intervals[-1] = [last[0], max(last[1], interval[1])]
        else:
            # Otherwise, add the current interval as a new one
            merged_intervals.append(interval)

# Step 3: Count the total number of unique points
total_points = 0
for interval in merged_intervals:
    total_points += interval[1] - interval[0] + 1

return total_points

if name == "main": # Test cases testArray1 = [[1, 4], [7, 10], [3, 5]] testArray2 = [[1, 2], [6, 10], [11, 15]] testArray3 = [[1, 3], [2, 6], [8, 10]]

# Check if the solution is correct
print(solution(testArray1) == 9)  # Expected: 9
print(solution(testArray2) == 12)  # Expected: 12
print(solution(testArray3) == 9)  # Expected: 9

思路分析

  1. 排序: 我们首先根据区间的起始值对区间进行排序,这样可以确保在合并过程中,较小的区间在前。排序的时间复杂度是 O(n log n),是最耗时的部分。

  2. 合并区间: 对于每个区间,我们检查它与已经合并的区间是否重叠。如果重叠,我们更新合并区间的结束值;如果不重叠,则将当前区间作为新的合并区间。 合并过程是线性的,时间复杂度是 O(n),因为我们只需要遍历一次排序后的区间。

  3. 计算唯一数字个数: 对于合并后的每个区间,我们通过 end - start + 1 来计算区间内的数字个数。每个区间的计算是常数时间 O(1),因此总的计算时间是 O(m),其中 m 是合并后的区间数。

  4. 时间复杂度: 排序的时间复杂度为 O(n log n),合并区间的时间复杂度为 O(n),计算总点数的时间复杂度为 O(m),其中 m 是合并后的区间数。综合来看,总时间复杂度是 O(n log n)。

学习总结

通过这道题,我加深了对区间合并问题的理解。在这类问题中,合并区间是核心,通常需要先排序,然后通过遍历合并。特别地,我理解了如何通过简单的条件判断合并区间并计算唯一数字的个数。这个过程需要用到排序、区间合并和简单的数学计算。

提高的地方: 算法思维:在这类题目中,首先明确数据结构(如区间)和解决思路是非常重要的,尤其是如何通过排序简化后续的合并过程。 编程技巧:通过简洁的条件语句判断是否需要合并区间,并且利用 max 函数来更新区间的结束值,使得代码更加简洁和高效。