1. 程式人生 > 其它 >LeetCode287 尋找重複數

LeetCode287 尋找重複數

題目

給定一個包含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
示例 3:
輸入:nums = [1,1]
輸出:1
示例 4:
輸入:nums = [1,1,2]
輸出:1

提示:
1 <= n <= 105
nums.length == n + 1
1 <= nums[i] <= n
nums 中 只有一個整數 出現 兩次或多次 ,其餘整數均只出現 一次

進階:
如何證明 nums 中至少存在一個重複的數字?
你可以設計一個線性級時間複雜度 O(n) 的解決方案嗎?

方法

判斷是否有環法

將陣列的值再看作下標從而將陣列看成連結串列,如果有重複數,則陣列組成的連結串列一定有環

  • 時間複雜度:O(n),n為陣列長度
  • 時間複雜度:O(1)
class Solution {
    public int findDuplicate(int[] nums) {
        int slow = 0,fast = 0;
        while(fast<nums.length){
            slow = nums[slow];
            fast = nums[nums[fast]];
            if(slow==fast){
                int p = 0;
                while(p!=slow){
                    p = nums[p];
                    slow = nums[slow];
                }
                return slow;
            }
        }
        return -1;

    }
}