如何高效实现带间隙二维数组的缺失数字单元素数组填充?
嘿,这个需求我刚好琢磨过,最高效的实现思路其实是利用子数组的起止点快速定位间隙,批量生成缺失的单元素数组,避免无意义的全量数字遍历。我给你拆解下具体逻辑和代码实现:
核心实现思路
- 先确保输入有序:虽然你的示例输入是按子数组起始递增排列的,但保险起见,先按每个子数组的第一个元素排序,避免输入无序导致结果混乱。
- 处理开头间隙:检查第一个子数组的起始数字,如果大于0,把0到起始数字-1的每个数单独做成数组,加到结果里,再把第一个子数组加进去。
- 遍历处理中间间隙:依次对比每一对相邻子数组,前一个子数组的末尾数字和后一个的起始数字之间的差值就是间隙范围。如果差值大于1,就把中间的每个数字单独做成数组插入进去,再添加当前子数组。
- 边界情况兜底:比如输入为空、子数组本身从0开始、子数组之间无间隙等情况,都要做简单判断处理。
Python代码示例
def fill_missing_gaps(input_arr): if not input_arr: return [] # 先按子数组的起始数字排序,确保顺序正确 sorted_arr = sorted(input_arr, key=lambda x: x[0]) result = [] # 处理第一个子数组之前的缺失部分 first_sub = sorted_arr[0] first_start = first_sub[0] if first_start > 0: for num in range(0, first_start): result.append([num]) result.append(first_sub) # 处理相邻子数组之间的间隙 for i in range(1, len(sorted_arr)): prev_sub = sorted_arr[i-1] curr_sub = sorted_arr[i] prev_end = prev_sub[-1] curr_start = curr_sub[0] # 如果存在间隙,插入缺失的单元素数组 if curr_start > prev_end + 1: for num in range(prev_end + 1, curr_start): result.append([num]) result.append(curr_sub) return result # 测试示例输入 input_example = [[1, 2, 3], [8, 9], [13, 14]] output_example = fill_missing_gaps(input_example) print(output_example) # 输出:[[0], [1, 2, 3], [4], [5], [6], [7], [8, 9], [10], [11], [12], [13, 14]]
为什么这个方式高效?
- 我们没有去遍历从0到最后一个数字的所有数,而是精准定位每个间隙的起止范围,只生成需要的缺失数组,避免了不必要的循环操作。
- 排序的时间复杂度是O(N log N)(N是输入子数组的数量),后续遍历和生成缺失数组的时间复杂度是O(M)(M是最终输出的数组总数),这已经是最优的时间复杂度了——毕竟最终要生成M个数组,不可能比O(M)更快。
如果是其他编程语言,思路也是完全一致的:排序输入、处理开头间隙、遍历相邻子数组处理中间间隙,只是语法细节不同而已。
内容的提问来源于stack exchange,提问作者Harry Solovay
相关产品推荐
相关产品推荐

