[LeetCode] Find the Duplicate Number
Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate element must exist. Assume that there is only one duplicate number, find the duplicate one.
Note:
- You must not modify the array (assume the array is read only).
- You must use only constant extra space.
- Your runtime complexity should be less than
O(n2)
.
二分查找,复杂度 O(nlogn)。
1 class Solution { 2 public: 3 int findDuplicate(vector<int>& nums) { 4 int l = 0, r = nums.size() - 1, m; 5 while (l <= r) { 6 m = l + ((r - l) >> 1); 7 int cnt = 0; 8 for (auto a : nums) if (a <= m) ++cnt; 9 if (cnt <= m) l = m + 1; 10 else r = m - 1; 11 } 12 return l; 13 } 14 };