数组中重复的数

10 篇文章 0 订阅

题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。


思路1:用交换的思想。遍历数组,将它们都各自放回属于自己的位置。判断第i个位置的元素tmp是否和i相等,相等则继续遍历下一个元素;否则,判断tmp和num[tmp]是否相等,相等则说明其对应的位置已经存在该数字,重复,return该数;否则交换两个元素。时间复杂度O(n),空间复杂度O(1)。

代码:

 bool duplicate(int numbers[], int length, int* duplication) {
        bool res = false;
        * duplication = -1;
        if(length < 2)
            return res;
        int tmp;
        for(int i = 0; i < length; i++)
        {
            if(numbers[i] > length - 1)  //数组元素有效性判断
                break;
            tmp = numbers[i];
        	if(i == tmp)  //下标值和对应的值相等,则遍历下一个数
                continue;
            if(numbers[tmp] == tmp)  //如果当前值m和num[m]相等,说明此数为重复的数
            {
                *duplication = tmp;
                res = true;
                break;
            }
            else   //否则交换
            {
                swap(numbers[i], numbers[tmp]);
            }  
        }
        return res;
    }

思路2:利用哈希表(此思路也可以理解为计数排序)。建立一个长度为length的哈希,每个元素值为0,代表数组中元素在对应位置上出现的次数。遍历数组,对于第i个数,如果hash(nuimbers[i])为0,则将该位加1,否则说明该数为重复数,直接return。时间和空间复杂度均为O(n)。

代码:

 bool duplicate(int numbers[], int length, int* duplication) {
         bool res = false;
         if(length < 2)
             return res;
         vector<int> hash(length, 0); //长度为length,且每个元素值为0
         int tmp = 0;
         for(int i = 0; i < length; i++)
         {
            tmp = numbers[i];
         	if(hash[tmp] == 0)
                hash[tmp]++;
             else
             {
                *duplication = tmp;
             	res = true;
             	break;        
             }
         }
         return res;
     }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值