思路:1.不准排序,2.常数空间使用,3.小于O(n^2)的时间复杂度,4.不是每个数都会出现。
1.不准排序限定了不能直接通过相邻比较。
2.常数空间使用限定了不能开辟额外的线性空间存储做hash查询
3.小于O(n^2)限定了不能暴力破解比较。
4.不是每个数都会出现限定了不能使用求和比较。
那么,只能用二分法了,写了一个accept的方法,但是不会证明时间复杂度低于O(n^2),只能看出来平均复杂度可能为O(nlgn)
耗时:442ms,暂时无图,目测中下游。
public class Solution {
public int findDuplicate(int[] nums) {
return f(nums,0,nums.length-1);
}
public int f(int[] nums,int s,int e){
if (s==e) {
return 0;
}
if (s+1==e) {
if (nums[s]==nums[e]) {
return nums[s];
}
return 0;
}
int m=(s+e)/2;
int a=f(nums,s,m);
int b=f(nums,m+1,e);
if (a!=0) {
return a;
}
if (b!=0) {
return b;
}
for (int i = s; i <=m; i++) {
for (int j = m+1; j <=e; j++) {
if (nums[i]==nums[j]) {
return nums[j];
}
}
}
return 0;
}
}