您的位置:首页 > 其它

Leetcode: Find the Duplicate Number

2016-01-03 15:59 337 查看
Given an array nums containing n + 1 integers where each integer is between 1 andn (inclusive), prove that at least one duplicate number 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, O(1) extra space.
Your runtime complexity should be less than
O(n2)
.
There is only one duplicate number in the array, but it could be repeated more than once.

不能改变数组本身,否则可以用计数排序的思想。

因为数组只包含1到N的数,且只含一个重复数字,可以用二分查找。取中点,看多少个数小于等于它,如果过半则说明重复数字在中点左侧。时间复杂度O(nlogn)。

class Solution {
public:
int findDuplicate(vector<int>& nums) {
int low = 0;
int up = nums.size() - 1;
while (low < up) {
int counts = 0;
int mid = low + (up - low) / 2;
for (int num : nums) {
if (num <= mid) {
++counts;
}
}

if (counts > mid) {
up = mid;
}
else {
low = mid + 1;
}
}

return low;
}
};


另一种巧妙的解法,把数组看成一个链表,因为有重复数字,所以链表有环。问题退化为求有环链表的交叉节点。

class Solution {
public:
int findDuplicate(vector<int>& nums) {
int slow = 0;
int fast = 0;
while (true) {
slow = nums[slow];
fast = nums[nums[fast]];
if (slow == fast) {
int duplicate = 0;
while (duplicate != slow) {
duplicate = nums[duplicate];
slow = nums[slow];
}

return duplicate;
}
}

return -1;
}
};


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode 二分查找