38/100. Find the Duplicate Number
阿新 • • 發佈:2019-01-10
給定一個包含n+1
個整數的陣列nums
,這些整數都在[1, n]
範圍內。假設肯定存在一個重複的整數,求這個整數。
附加要求:
①不能修改陣列(假設nums是隻讀的);
②空間複雜度要求為O(1);
③時間複雜度要求小於O(n2);
④陣列中只有一個重複的數字,但是它可以重複多次。
條件①限制不能使用sorted()
對原陣列進行排序,條件②限制不能使用dict
進行記錄,條件③限制不能使用for迴圈
巢狀。
二分法:
空間複雜度:O(1);時間複雜度:O(n logn)
陣列首尾設定left
和right
,以陣列最中間的數字下標(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