难度中等1132
给定一个包含 n + 1
个整数的数组 nums
,其数字都在 1
到 n
之间(包括 1
和 n
),可知至少存在一个重复的整数。
假设 nums
只有 一个重复的整数 ,找出 这个重复的数 。
示例 1:
输入:nums = [1,3,4,2,2]
输出:2
示例 2:
输入:nums = [3,1,3,4,2]
输出:3
示例 3:
输入:nums = [1,1]
输出:1
法1:
class Solution {
public:
int findDuplicate(vector<int>& nums) {
sort(nums.begin(), nums.end());
auto it = std::adjacent_find(nums.begin(),nums.end());
return *it;
}
};
法2:
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int l = 0, r = nums.size() - 1;
while(r - l > 1){ //枚举范围为(l, r]左开右闭区间
int mid = (l + r) >> 1;
int c = 0;
for(int num : nums)
if(num <= mid) c++;
if(c > mid) r = mid;
else l = mid;
}
return r;
}
};
法3:
class Solution {
public:
// 数组中有重复数字就可以认为数组转换为链表后有环
// 可将数组看成是链表:第i个位置指向第nums[i]的位置的结点
// 分为两个步骤
// 1、先寻找链表中环的入口(将快指针入环)
// 2、将慢指针重回原点,搜索整个链表
int findDuplicate(vector<int>& nums) {
// 初始化快慢指针
int slow = nums[0], fast = nums[slow];
// 寻找环的入口
while(slow != fast){
slow = nums[slow];
fast = nums[nums[fast]];
}
// 慢指针归0
slow = 0;
// 利用快慢指针搜索整个数组
while(slow != fast){
slow = nums[slow];
fast = nums[fast];
}
return slow;
}
};