其他分享
首页 > 其他分享> > 剑指offer3

剑指offer3

作者:互联网

我的想法先排序,再建立一个哈希表,如果大于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;
    }

标签:return,nums,int,元素,num,offer3,哈希
来源: https://blog.csdn.net/Magic_o/article/details/109906931