【leetcode】【medium】【每日一題】287. Find the Duplicate Number

287. Find the Duplicate Number

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.

題目鏈接:https://leetcode-cn.com/problems/find-the-duplicate-number/

 

思路

法一:最原始的方法

set記錄已遍歷元素,代碼量最少。

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        unordered_set<int> s;
        for(int i=0; i<nums.size(); ++i){
            if(s.find(nums[i])==s.end()){
                s.insert(nums[i]);
            }else{
                return nums[i];
            }
        }
        return 0;
    }
};

法二:快慢指針

原本值和位置可一一對應,但由於多一個元素,必定出現環。因此用快慢指針,兩者肯定有相遇的時刻。

思路參考:https://leetcode-cn.com/problems/find-the-duplicate-number/solution/miao-dong-kuai-man-zhi-zhen-by-wo-you-dian-ben/

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        int s = 0,  f = 0;
        do{
            s = nums[s];
            f = nums[nums[f]];
        }while(s!=f);
        s = 0;
        while(s!=f){
            s = nums[s];
            f = nums[f];
        }
        return s;
    }
};

法三:位運算

參考:https://leetcode-cn.com/problems/find-the-duplicate-number/solution/xun-zhao-zhong-fu-shu-by-leetcode-solution/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章