给定 N 个大小为 N 的数组,并且它们都已排序,如果它不允许您使用额外的空间,那么如何有效地或以更少的时间复杂度找到它们的共同数据?
例如:
1. 10 160 200 500 500
2. 4 150 160 170 500
3. 2 160 200 202 203
4. 3 150 155 160 300
5. 3 150 155 160 301
这是一个面试问题,我发现了一些类似的问题,但它们不包括输入被排序或无法使用额外内存的额外条件。
我想不出任何小于 O(n^2 lg n) 复杂度的解决方案。在这种情况下,我更愿意使用最简单的解决方案,它给我带来了这种复杂性,即:
not_found_flag = false
for each element 'v' in row-1
for each row 'i' in the remaining set
perform binary search for 'v' in 'i'
if 'v' not found in row 'i'
not_found_flag = true
break
if not not_found_flag
print element 'v' as it is one of the common element
我们可以通过比较每行的最小值和最大值来改进这一点,并根据这一点决定数字“num”是否可能落在该行的“min_num”和“max_num”之间。
二进制搜索 -> O(log n) 用于在 n-1 行中搜索 1 个数字:O(nlogn) 对第一行中的每个数字进行二进制搜索:O(n2logn)
我选择了第一行,我们可以选择任何行,如果在任何(N-1)行中没有找到所选择的行的元素,那么我们实际上没有公共数据。