一、题目描述

二、解题思路

这是剑指Offer的原题。。。。。。评论区用的都是有环链表的方法

  • 一个萝呗一个坑儿,如果没有重复那么下标与元素值应该可以达成一一对应
  • 那么如果当前下标和元素值不同,那么我们就不断地调整,也就是说把这个元素调到它应该在的位置
  • 如果发现了它要去的那个地方被一个和它相等的元素占了,那就直接返回
  • over

时间复杂度O(n),空间复杂度S(1)

三、解题代码

class Solution {
   
public:
    int findDuplicate(vector<int>& nums) {
   
        if(!nums.size())    return -1;
        for(int i = 0; i < nums.size(); i++){
   
            while(nums[i] - 1 != i){
   
                if(nums[i] == nums[nums[i] - 1])    return nums[i];
                swap(nums[nums[i] - 1], nums[i]);
            }
        }
        return 0;
    }
};

四、运行结果

我是真的理解不了为什么空间复杂度为S(1)才击败了百分之五。。。。。。。。