【每日一题】寻找重复数

文章目录

  • 题目描述
  • 题解

【每日一题】寻找重复数_第1张图片

题目描述


287. 寻找重复数
给定一个包含 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 中 只有一个整数 出现 两次或多次 ,其余整数均只出现 一次

进阶:

如何证明 nums 中至少存在一个重复的数字?
你可以设计一个线性级时间复杂度 O(n) 的解决方案吗?

题解


【每日一题】寻找重复数_第2张图片

题目中给出暗示数字都在 [1, n] 范围内(包括 1 和 n),这就说明了给出的数不会超过数组的下标,那么我们可以利用这组数字作为下标。实际上就形成环形的链表结构,下标标识一个个节点,nums[i] 标识着下一个节点的位置。

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        //有重复整数证明有环
        //环的入口处说明了重复的位置
        if(nums.empty()) return 0;
        int slow = nums[0];
        int fast = nums[nums[0]];
        while(slow != fast)
        {
            //cout << slow << " " << fast << endl;
            slow = nums[slow];
            fast = nums[nums[fast]];
        }
        int pre1 = 0;
        int pre2 = slow;
        while(pre1 != pre2){
            pre1 = nums[pre1];
            pre2 = nums[pre2];
        }
        return pre1;
    }
};



end

  • 喜欢就收藏
  • 认同就点赞
  • 支持就关注
  • 疑问就评论

你可能感兴趣的:(算法,leetcode,算法,数据结构)