数组中重复的数字(哈希表,换位索引)

找出数组中重复的数字。

 

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

 

示例 1:

 

输入:

[2, 3, 1, 0, 2, 5, 3]

输出:2 或 3 

 

解题思路1:哈希表

1.创建一个哈希表

2.遍历nums数组中每个元素

        如果该元素在哈希表中的值为true

                       则返回该值

        如果不为true或该元素不在哈希表中

                       则把该元素添加进哈希表中,

                       并且赋值为true。

3.返回-1。(表示无重复值)

 

代码:

 

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) {

 

// 第一步
        unordered_map<int,bool>map;

 

// 第二步
        for(int num : nums) {
            if(map[num]==true)
                return num;
            map[num]=true;
        }

 

// 第三步
        return -1;


    }
};

 

图解:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 

 也就是在哈希表中寻找该元素,并且判断其值是否为true。如果在哈希表中没有找到,就把该元素添加进哈希表中,并且赋值true给它。

 

 

解题思路2:换位索引

1.设索引值 i=0

2.遍历数组nums

        如果第 i 个位置的元素等于 i  (nums[i]=i)

               则i++,进行下个循环

        如果该元素对应的下标的元素等于该元素

        (nums[nums[i]]==nums[i])

               则返回该元素(出现一对多,说明重复)

        否则交换该元素与该元素对应的下标的元素,继续下个循环

3.返回 -1 (说明没有重复数字)

 

代码:

 

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) {

 

// 第一步
        int i=0;

 

// 第二步
        while(i<nums.size()) {
            if(nums[i]==i) {
                i++;
                continue;
            }      
                    
            if(nums[nums[i]]==nums[i])
                return nums[i];
        
          swap(nums[i],nums[nums[i]]);
        }

 

// 第三步


        return -1;


    }
};

 

图解:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 因为题目说:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。有重复,说明一定会有一对多的情况。所以可以通过索引

交换他们的位置,并且等于索引值,然后就可以通过索引来判断是否重复。

               

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值