给定一个长度为 的数组nums
,数组中所有的数均在 的范围内,其中 。
请找出数组中任意一个重复的数,但不能修改输入的数组。
样例
给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。 返回 2 或 3。
思考题:如果只能使用 的额外空间,该怎么做呢?
思路,本题不允许修改数组元素,考虑到所有数均保证在1-n范围内,可以把1-n这个n个位置作为一个有序数组来看, 对于数组元素nums[i]总能从1-n中找到其应该放的位置。
我们可以考虑用分治思想来解决,对于1-n这个有序数组,如果没有nums[i] 重复元素,则能保证左边数个数==右边数个数。如果有重复元素,重复元素一定在数多的一边。
于是我们采用二分法,每次统计左右两边数的个数,往数多的地方分治,最终会找到重复的数。
2.先分享下雪大的二分查找模板,这个比较容易混淆
3.代码如下:
class Solution { public: int duplicateInArray(vector<int>& nums) { //已知长度一定为n+1 int n=nums.size()-1; int l=1,r=n; while(l<r){ int mid=l+r>>1; int s=0; for(auto x:nums){ //统计左边数个数 if(x>=l&&x<=mid){ s++; } } //如果左边数个数>平均数 if(s>mid-l+1>0){ //往左边找 r=mid; }else{ l=mid+1; } } return r; //l==r了,输出最终的结果 } };
有话要说...