我有一个非常大的已排序数组。如何计算或打印出数组中所有唯一元素?
假设我的数组是[2,3,3,3,4,6,6,7],那么输出应该是2、3、4、6、7。
我知道如何在O(n)时间内完成这个任务。但面试官要求我在O(log n)时间内完成?这可能吗?
我有一个非常大的已排序数组。如何计算或打印出数组中所有唯一元素?
假设我的数组是[2,3,3,3,4,6,6,7],那么输出应该是2、3、4、6、7。
我知道如何在O(n)时间内完成这个任务。但面试官要求我在O(log n)时间内完成?这可能吗?
这里有一个算法,其时间复杂度为O(logn*k)
,其中k是唯一元素:
set uniQ
int ind = 0;
do {
uniQ.add(arr[i]);
ind = BinSearchGreater(arr,arr[ind],ind+1);
if(ind >= arr.length)
break;
} while(true);
BinSearchGreater(arr,key,start_ind) : returns index of first element greater than key in subarray starting at start_ind
时间复杂度:-
请注意,当独特元素的数量较少时,此算法才有效。
如果所有元素都是唯一的,则渐进复杂度为O(n*logn)
,比线性还要劣。
M log N
的时间复杂度完成,其中M
是结果的大小。您可以通过运行多个二进制搜索来实现这一点。 - piotrekg2