14. 不修改数组找出重复的数字难度: 一般 / 知识点: 抽屉原理 二分

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了14. 不修改数组找出重复的数字难度: 一般 / 知识点: 抽屉原理 二分相关的知识,希望对你有一定的参考价值。


第一种方法: 开了map计数,多用了空间,map: logn,时间复杂度O(nlogn)

class Solution {
public:
    int duplicateInArray(vector<int>& nums) 
    {
        map<int,int>mp;
        for(int i=0;i<nums.size();i++)
        {
            mp[nums[i]]++;
            if(mp[nums[i]]>1) return nums[i];
        }
    }
};

第二种方法: 抽屉原理,二分,时间复杂度O(nlogn)

class Solution {
public:
    int duplicateInArray(vector<int>& nums) 
    {
        int l=1,r=nums.size()-1;// 数的取值范围
        while(l<r)
        {
            int mid=l+r>>1;
            int s=0;
            for(int i=0;i<nums.size();i++) if(nums[i]>=l&&nums[i]<=mid) s++;
            if(s>mid-l+1) r=mid;//说明左边多放了
            else l=mid+1;
        }
        return l;
    }
};

以上是关于14. 不修改数组找出重复的数字难度: 一般 / 知识点: 抽屉原理 二分的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer第2题不修改数组找出重复的数字

面试题3:不修改数组找出重复的数字

13. 找出数组中重复的数字难度: 简单 / 知识点: 模拟

不修改数组找出重复的数字

不修改数组找出重复的数字(c语言)

《剑指Offer——不修改数组找出重复的数字》代码