不修改数组找出重复的数字
题目描述:
给定一个长度为 n+1 的数组nums
,数组中所有的数均在 1∼n1∼n 的范围内,其中 n≥1n≥1。
请找出数组中任意一个重复的数,但不能修改输入的数组。
样例
给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。 返回 2 或 3。
思考题:如果只能使用 O(1)O(1) 的额外空间,该怎么做呢?
解题思路:
因为一共有n+1个数,而数的取值为1~n,所以一定会有重复的数字
若不改变数组的话,可使用二分,区间分为[l, mid], [mid + 1, r]。
统计数组中在[l, mid]和[mid+1, r]的个数,如果左边的数大于区间长度mid - l + 1的话,证明左边区间存在重复的数,否则右边区间存在重复的数
代码:
1 class Solution { 2 public: 3 int duplicateInArray(vector<int>& nums) { 4 int l = 1, r = nums.size()-1; 5 6 while(l < r) 7 { 8 int mid = l + r >> 1; 9 int s = 0; 10 for(auto x : nums) 11 { 12 if(x >= l && x <= mid) s++; 13 } 14 if(s > mid - l + 1) r = mid; 15 else l = mid + 1; 16 } 17 return l; 18 } 19 };