1. 程式人生 > >38/100. Find the Duplicate Number

38/100. Find the Duplicate Number

在這裡插入圖片描述
給定一個包含n+1個整數的陣列nums,這些整數都在[1, n]範圍內。假設肯定存在一個重複的整數,求這個整數。
附加要求:
①不能修改陣列(假設nums是隻讀的);
②空間複雜度要求為O(1);
③時間複雜度要求小於O(n2);
④陣列中只有一個重複的數字,但是它可以重複多次。

條件①限制不能使用sorted()對原陣列進行排序,條件②限制不能使用dict進行記錄,條件③限制不能使用for迴圈巢狀。

二分法:
空間複雜度:O(1);時間複雜度:O(n logn)

陣列首尾設定leftright,以陣列最中間的數字下標(index)作為基準,稱之為mid
然後遍歷整個陣列,若陣列中小於mid

的數字的個數小於或等於它,則多餘數字的數值應該大於mid,即left=mid+1;若陣列中小於mid的數字的個數大於它,則多餘數字的數值應該小於mid,即right=mid-1
舉例說明:mid=2。正常排序的話,count值應為2,數字為“1”“2”。若count>2,說明數字“1”“2”當中肯定有重複的,即所求的數字應該在前半部分,即right=mid-1

class Solution(object):
    def findDuplicate(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        left = 0
        right = len(nums)-1
        while left<=right:
            mid = (left+right)/2
            count = 0
            for i in range(len(nums)):
                if nums[i] <= mid:
                    count += 1
            if count <= mid:
                left = mid+1
            else:
                right = mid-1
        return left