力扣第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 <= 105
- nums.length == n + 1
- 1 <= nums[i] <= n
- nums中 只有一个整数 出现 两次或多次 ,其余整数均只出现 一次
思路和解题方法
- 首先,获取输入数组的长度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号
浙公网安备 33010602011771号