剑指 Offer 03 数组中的重复数字

题目:一个长度为n的数组中元素都是0~n-1的,且数组中有重复元素,要求返回任意一个重复的数。

public int findRepeatNumber(int[] nums)

思路:1.用set(HashSet)来做。重复的元素都可以考虑用set做。
把元素放到set里,直到遍历到重复的元素。时间复杂度O(n)(遍历一遍,hashSet的add和contains都是O(1),因为hashSet是基于哈希表实现的),空间复杂度为O(n)。
2.边遍历边根据下标与值的关系进行交换。(先举有重复和无重复的例子,得到下标与值的对应关系)。每次交换就会凑成一对,当到达重复的元素的下标时就发现它重复了。

	//set实现(重复的问题都可以用set去解决)
    public int findRepeatNumber(int[] nums){
        if(nums == null || nums.length == 0){
            return -999;
        }
        //HashSet是基于哈希表实现的,add remove contains都是O(1)
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < nums.length; i++) {
            if(!set.contains(nums[i])){
                set.add(nums[i]);
            }else{
                return nums[i];
            }
        }
        return -999;
    }
	//边遍历边根据下标和值的对应进行交换
    public int findRepeatNumber(int[] nums){
        if(nums == null || nums.length == 0){
            return -999;
        }
        for (int i = 0; i < nums.length; i++) {
            //处理下标和值相等的情况
            if(i == nums[i]){
                continue;
            }
            if(nums[nums[i]] != nums[i]){
                //交换后原nums[i]的下标和值就凑成了一对
                int temp = nums[i];
                nums[i] = nums[nums[i]];
                //nums[i]已经被修改了,不能再使用,用temp
                nums[temp] = temp;
            }else{
                //这种情况只能是重复的数
                return nums[i];
            }
        }
        //没找到
        return -999;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值