Given an array of integers nums
containing n + 1
integers where each integer is in the range [1, n]
inclusive.
There is only one repeated number in nums
, return this repeated number.
You must solve the problem without modifying the array nums
and uses only constant extra space.
Example 1:
Input: nums = [1,3,4,2,2] Output: 2
Example 2:
Input: nums = [3,1,3,4,2] Output: 3
Constraints:
1 <= n <= 105
nums.length == n + 1
1 <= nums[i] <= n
- All the integers in
nums
appear only once except for precisely one integer which appears two or more times.
Follow up:
- How can we prove that at least one duplicate number must exist in
nums
? - Can you solve the problem in linear runtime complexity?
class Solution:
def findDuplicate(self, nums: List[int]) -> int:
left, right = 1, len(nums) - 1
while left < right:
mid = (left + right) >> 1
cnt = sum(v <= mid for v in nums)
if cnt > mid:
right = mid
else:
left = mid + 1
return left
class Solution {
public int findDuplicate(int[] nums) {
int left = 1, right = nums.length - 1;
while (left < right) {
int mid = (left + right) >> 1;
int cnt = 0;
for (int v : nums) {
if (v <= mid) {
++cnt;
}
}
if (cnt > mid) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
}
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int left = 1, right = nums.size() - 1;
while (left < right)
{
int mid = (left + right) >> 1;
int cnt = 0;
for (int& v : nums)
if (v <= mid)
++cnt;
if (cnt > mid) right = mid;
else left = mid + 1;
}
return left;
}
};
func findDuplicate(nums []int) int {
left, right := 1, len(nums)-1
for left < right {
mid := (left + right) >> 1
cnt := 0
for _, v := range nums {
if v <= mid {
cnt++
}
}
if cnt > mid {
right = mid
} else {
left = mid + 1
}
}
return left
}
/**
* @param {number[]} nums
* @return {number}
*/
var findDuplicate = function (nums) {
let left = 1,
right = nums.length - 1;
while (left < right) {
const mid = (left + right) >> 1;
let cnt = 0;
for (let v of nums) {
if (v <= mid) {
++cnt;
}
}
if (cnt > mid) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
};
function findDuplicate(nums: number[]): number {
let left = 1,
right = nums.length - 1;
while (left < right) {
const mid = (left + right) >> 1;
let cnt = 0;
for (let v of nums) {
if (v <= mid) {
++cnt;
}
}
if (cnt > mid) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}