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

找出数组中重复的数字。


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

示例 1:

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

限制:

2 <= n <= 100000

来源:力扣(LeetCode)
 

Note:

方法一:

此题需要注意的是:nums 里的所有数字都在 0~n-1 的范围内,抓住这一点就好解了。可以采用哈希表。

1.定义一个整型数组赋初值为-1

2.将数组nums中的值作为book[]数组的下标

3.遍历数组,如果book[num[i]] 初值为-1,则赋值为nums[i].

4.遍历数组是,如果book[num[i]] 初值不为-1,则表明之前出现过,直接返回。

C++:

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) {
        int book[nums.size()];
        memset(book,-1,sizeof(book));
        for (int i = 0; i<nums.size(); i++){
            if (book[nums[i]] == -1){
                book[nums[i]] = nums[i];
               
            }else{
                return nums[i];
             }
        }
        return -1;
    }
};

 return -1在函数末尾,是在没有任何一个数字重复的情况下返回-1。虽然题目中约定必有重复的数字,但是编译器要求必须在所有情况下都有返回值,不然会编译错误,所以就在末尾加上了这一句。

 

方法二:

一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内,利用下标,数值的范围与下标的范围一样。把数值当作下标,如果数值是第一次出现,就将数值变为负数。继续遍历数组时,如果对应的值是负数,则为重复数。

class Solution {
    public int findRepeatNumber(int[] nums) {
        for(int i = 0; i<nums.length; i++){
            int index = Math.abs(nums[i]);
            if(nums[index] < 0)
                return index;
            nums[index] *= -1;
        }
        return 0;
    }
}

方法三:

利用Set集合。

class Solution {
    public int findRepeatNumber(int[] nums) {
      Set<Integer> set = new HashSet<Integer>();
       for(int i:nums){
           if(set.contains(i))
        	   return i;
           else set.add(i);
       }
       return 0;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值