剑指offer3

本文介绍三种查找数组中重复数字的方法:使用哈希表、排序和抽屉原理。通过实例代码展示了每种方法的具体实现,帮助读者理解不同算法的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的想法先排序,再建立一个哈希表,如果大于1,那就返回

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int last=nums[nums.size()-1];
        vector<int> num(last+1);
        for(int i=0;i<num.size();i++){
            num[i]=0;
        }
        for(int i=0;i<num.size();i++){
            num[nums[i]]=num[nums[i]]+1;
        }
        for(int i=0;i<num.size();i++){
            if(num[i]>1){
                return i;
            }
        }
        return 0;
    }                                                                                           
};

别人:
方法1:哈希表。

int findRepeatNumber(vector<int>& nums) {
        unordered_map<int,int> mp;//空的哈希表
        for(int i=0;i<nums.size();i++){
            if(mp.find(nums[i]) != mp.end()) return nums[i];//查看元素是不是在哈希表里面是返回
            else mp[nums[i]] ++;//不在哈希表里面就把这个元素的位置加一
        }
        return -1;
    }

方法2.排序

int findRepeatNumber(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        for(int i=1;i<nums.size();i++){
            if(nums[i-1] == nums[i]) return nums[i];//相邻两个元素是不是相同,相同就返回
        }
        return -1;
    }

方法3.抽屉原理。如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有n+1个元素放到n个集合中去,其中必定有一个集合里至少有两个元素。
因为出现的元素值 < nums.size(); 所以我们可以将见到的元素 放到索引的位置,如果交换时,发现索引处已存在该元素,则重复 O(N) 空间O(1)

int findRepeatNumber(vector<int>& nums) {
        for(int i=0;i<nums.size();i++){
            while(nums[i]!=i){ //不相等[1,2,2],一个一个向后找,想让在第0个位置上的数是0,第1个位置上的数字是1,第二个位置上的数字是2,nums[i](1)是要和nums[nums[i]](2)交换的
                if(nums[nums[i]] == nums[i]) return nums[i];//判断,如果原来位置上就有一个和位置一样的数字了比如说nums[2]=2 nums[nums[2]]=2说明重复了,返回这个值
                int tmp = nums[i];
                nums[i] = nums[tmp];//否则就进行交换。将nums的数字都挪动到数字对应的位置上
                nums[tmp] = tmp;
            }
        }
        return -1;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值