题目描述:
大体意思
一个大小为n+1的数组中的元素都是1到n的整数。假设只有一个数会出现多次(注意是多次而不一定就是两次),找到那个数
要求是常数的空间复杂度和小于n^2的时间复杂度
算法
暴力搜 O(n^2)
虽说题目说了要小于n^2,刚开始随便写了一下,竟然也过了。。不过时间就不太好看了,945ms
二分法 O(nlogn)
这个就好一点,就用了9ms
注意不是和平时的二分有点区别,主要是比较的mid而非nums[mid]
int findDuplicate(int* nums, int numsSize) {
int min = 0,max = numsSize - 1;
while (min <= max){
int mid = min + (max - min) / 2;
int count = 0;
for (int i =0; i< numsSize; i ++){
if (nums[i] <= mid)
count ++;
}
if (count > mid){
max = mid-1;
}
else min = mid + 1;
}
return min;
}
映射找环
还有更吊的“映射找环”法,直接把时间复杂度优化到了O(n)。。。每次见到这种巧妙的算法,总有种Woc,Orz的感觉
算法详情可见这里