给定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)行中没有找到该行选择的任何一个元素,则实际上我们没有共同的数据。