Algorithms—287.Find the Duplicate Number

思路: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;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值