力扣第287题 寻找重复数 快慢指针 c++注释版
题目
中等
给定一个包含
n + 1个整数的数组nums,其数字都在[1, n]范围内(包括1和n),可知至少存在一个重复的整数。假设
nums只有 一个重复的整数 ,返回 这个重复的数 。你设计的解决方案必须 不修改 数组
nums且只用常量级O(1)的额外空间。
示例 1:
输入:nums = [1,3,4,2,2] 输出:2
示例 2:
输入:nums = [3,1,3,4,2] 输出:3
提示:
1 <= n <= 105nums.length == n + 11 <= nums[i] <= nnums中 只有一个整数 出现 两次或多次 ,其余整数均只出现 一次
思路和解题方法
- 首先,获取输入数组的长度n,这里假设数组长度为n+1,因为数组中包含了重复数字。
- 对输入数组进行排序,可以使用sort函数进行排序,这样可以将相同的数字排在一起。
- 使用快慢指针法来查找重复的数字。初始化两个指针slow和fast,分别指向数组的第一个和第二个元素。同时,用一个整型变量iff来标记是否处理过相同的数字。
- 在循环中,比较slow和fast指向的数字:
- 如果它们不相等,说明当前数字还没有被处理过。
- 如果iff为1,表示前面的数字已经处理过了,此时更新fast指针,使其向后移动2个位置,同时将iff设为0。
- 如果iff为0,表示前面的数字还没有处理,此时更新slow指针,使其向后移动2个位置,同时将iff设为1。
- 如果它们相等,说明找到了重复数字,此时跳出循环。
- 返回slow指针所指向的数字,即为重复的数字。
复杂度
时间复杂度:
O(n * log n)
时间复杂度是O(nlogn),其中n是数组的长度。这是因为在代码中使用了排序算法(sort函数),最坏情况下的排序时间复杂度是O(nlogn)。
空间复杂度
O(1)
空间复杂度是O(1),也就是常数级别的额外空间。这是因为除了输入的nums数组以外,没有使用额外的数据结构来存储数据,而是仅使用了几个整型变量来辅助查找重复数字。所以空间复杂度是常数级别的。
c++ 代码
class Solution {
public:
int findDuplicate(vector<int>& nums) {
// 获取数组的长度
int n = nums.size() - 1;
// 对数组进行排序
sort(nums.begin(), nums.end());
// 使用快慢指针法查找重复数字
int slow = 0;
int fast = 1;
int iff = 0;
while (slow < n && fast < n)
{
if (nums[slow] != nums[fast])
{
// 如果iff为1,表示前面的数字已经处理过了
if (iff == 1)
{
fast += 2;
iff = 0;
}
else {
slow += 2;
iff = 1;
}
}
else
{
break; // 找到重复数字,退出循环
}
}
return nums[slow]; // 返回重复的数字
}
};
觉得有用的话可以点点赞,支持一下。
如果愿意的话关注一下。会对你有更多的帮助。
每天都会不定时更新哦 >人< 。
浙公网安备 33010602011771号