03. 数组中重复的数字

题目:
找出数组中重复的数字。

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1
的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例 1:

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:23 

第一种方法:
解析:
这里利用HashSet(无序,不可重复)的不可重复的特点
当遍历该数组的时候如果不能把下一个数字添加进集合里,说明出现了重复的数字,此时把该数字记录下来,跳出循环,最后返回即可。
注:此算法的时间复杂度是O(n),需要便利一遍数组,空间复杂度是以一个大小为O(n)的哈希表为代价的

class Solution {
    public int findRepeatNumber(int[] nums) {
        HashSet<Integer> result = new HashSet<Integer>();
        int repeatNum=0;
        for(int num:nums){
            if(!result.add(num)){
                repeatNum=num;
                break;
            }
        }
        return repeatNum;
    }
}

第二种方法:原地置换
解析:该方法利用的是一共n个数,如果没有重复且该数组有顺序的情况下则下标是几,那么对应的数字也应该是几。
思路:

  1. 循环这个数组
  2. 接下来判断该数组的下标与该位置的数是否不相等(因为如果相等的话直 接next就行了不需要判断)
  3. 当不相等时,则需要把当前位置的数字置换到对应的数组下标处
  4. 交换过后,继续往下走,遇到有与该数字对应的下标处的相同的数字,说明该数字是重复的,直接返回该数字
    注:代码中尽管有一个两重循环,但每个数字最多只要交换两次就能找到它自己的位置,因此时间复杂度为O(n)。另外,所有的操作步骤是在输入数组上进行的,不需要额外的分配内存,因此空间复杂度为O(1)。
class Solution {
    public int findRepeatNumber(int[] nums) {
       int temp;
       for(int i=0;i<nums.length;i++){
          while(nums[i]!=i){
            //查找到比如第四个数字的数与该数字代表的下标处的数相等,则代表重复     
            if(nums[i]==nums[nums[i]]){    
                return nums[i];
            }
            // 置换数字到对应的下标处  使数组变得有序
            temp=nums[i];
            nums[i]=nums[temp];
            nums[temp]=temp;
          }
       }
       return -1;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值