【CODE】Find the Duplicate Number

287. Find the Duplicate Number

Medium

3145369FavoriteShare

Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number must exist. Assume that there is only one duplicate number, find the duplicate one.

Example 1:

Input: [1,3,4,2,2]
Output: 2

Example 2:

Input: [3,1,3,4,2]
Output: 3

Note:

  1. You must not modify the array (assume the array is read only).
  2. You must use only constant, O(1) extra space.
  3. Your runtime complexity should be less than O(n2).
  4. There is only one duplicate number in the array, but it could be repeated more than once.
  • 与442题类似,但注意本题该重复数字只有一个,可以重复不止一次。
  • A.相反数
  • Runtime: 12 ms, faster than 74.01% of C++ online submissions for Find the Duplicate Number.
  • Memory Usage: 10 MB, less than 67.50% of C++ online submissions for Find the Duplicate Number.
  • B.交换到该数字应该在的地方,数组最后一个数字就是发生重复的数字:
  • Runtime: 12 ms, faster than 74.01% of C++ online submissions for Find the Duplicate Number.
  • Memory Usage: 9.8 MB, less than 100.00% of C++ online submissions for Find the Duplicate Number.
  • C.加n
  • Runtime: 8 ms, faster than 97.65% of C++ online submissions for Find the Duplicate Number.
  • Memory Usage: 10 MB, less than 62.50% of C++ online submissions for Find the Duplicate Number.
  • Next challenges:
  • First Missing Positive
  • Linked List Cycle II
class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        int n=nums.size();
        for(int i=0;i<n;i++){
            if(nums[abs(nums[i])-1]<0) return abs(nums[i]);
            else nums[abs(nums[i])-1]*=-1;
        }
        return nums[n-1];
    }
};
class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        int n=nums.size();
        for(int i=0;i<n;i++){
            if(nums[i]!=nums[nums[i]-1]){
                swap(nums[i],nums[nums[i]-1]);
                i--;
            }
        }
        return nums[n-1];
    }
};
class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        int n=nums.size();
        for(int i=0;i<n;i++){
            nums[nums[i]%n-1]+=n;
        }
        for(int i=0;i<n;i++){
            if(nums[i]>2*n) return i+1;
        }
        return 0;
    }
};
发布了133 篇原创文章 · 获赞 35 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/Li_Jiaqian/article/details/103327351
今日推荐