学习日记:合并区间并计算唯一数字的个数
题目解析
这道题目要求我们计算多个递增的数字范围(区间)合并后的唯一数字个数。具体来说,给定一系列的数字区间,我们需要:
- 合并所有重叠的区间;
- 计算所有唯一数字的个数。
例如,给定区间 [[1, 4], [7, 10], [3, 5]],这些区间合并后会变成 [[1, 5], [7, 10]],然后计算其中的唯一数字个数,结果是 9。
关键思路:
- 区间合并:多个区间可能会有重叠部分,合并后我们需要确保同一数字不被计算两次。
- 计数:合并后的每个区间计算其中的数字个数,通过
end - start + 1来计算一个区间内的数字数量。
解题思路
- 排序:首先,我们需要对所有区间按起始值进行排序。排序后,方便我们依次检查并合并区间。
- 合并区间:遍历排序后的区间,如果当前区间的起始值小于等于上一个区间的结束值,则这两个区间重叠,可以合并;否则,将当前区间添加为新的区间。
- 计算唯一数字个数:合并后的每个区间的数字个数通过
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
思路分析
-
排序: 我们首先根据区间的起始值对区间进行排序,这样可以确保在合并过程中,较小的区间在前。排序的时间复杂度是 O(n log n),是最耗时的部分。
-
合并区间: 对于每个区间,我们检查它与已经合并的区间是否重叠。如果重叠,我们更新合并区间的结束值;如果不重叠,则将当前区间作为新的合并区间。 合并过程是线性的,时间复杂度是 O(n),因为我们只需要遍历一次排序后的区间。
-
计算唯一数字个数: 对于合并后的每个区间,我们通过
end - start + 1来计算区间内的数字个数。每个区间的计算是常数时间 O(1),因此总的计算时间是 O(m),其中 m 是合并后的区间数。 -
时间复杂度: 排序的时间复杂度为 O(n log n),合并区间的时间复杂度为 O(n),计算总点数的时间复杂度为 O(m),其中 m 是合并后的区间数。综合来看,总时间复杂度是 O(n log n)。
学习总结
通过这道题,我加深了对区间合并问题的理解。在这类问题中,合并区间是核心,通常需要先排序,然后通过遍历合并。特别地,我理解了如何通过简单的条件判断合并区间并计算唯一数字的个数。这个过程需要用到排序、区间合并和简单的数学计算。
提高的地方:
算法思维:在这类题目中,首先明确数据结构(如区间)和解决思路是非常重要的,尤其是如何通过排序简化后续的合并过程。
编程技巧:通过简洁的条件语句判断是否需要合并区间,并且利用 max 函数来更新区间的结束值,使得代码更加简洁和高效。