給定乙個 n + 1 個整數組成的陣列 nums,其數字都在 1 到 n 之間(包括 1,n),可知至少存在乙個重複的整數。
題意:1~n個數本來該是n個數,組成n+1個數,則必然有重複數,找出重複數,而且題目假設只有乙個重複數,所以剩下的數要填滿1-n的數
使用二分方法,統計<=mid的個數,如果左邊不重複,則<=mid的數,應該為mid的值,如果大於mid的值,說明有左邊有重複的數,反之右邊有重複的數;抽屜原理
不改變原陣列的排序,空間複雜度為o(1)
本題說的nums的範圍是[1,n],所以去找中位數mid,然後nums和中位數去比較,雖然nums沒有排序,但是整個nums中小於等於mid的個數,要是比mid大,說明統計的時候左邊多統計了有重複數
class
solution
:def
findduplicate
(self, nums: list[
int])-
>
int:
left,right=0,
len(nums)-1
while left#《還是<=可以後期推一遍,看<=能不能執行,=的時候,left list out of index
mid=left+
(right-left)//2
count=
0for num in nums:
if num<=mid:
#統計<=mid的個數 即左邊的個數不是完全處於中位數分布的左邊,是有重複數的
count+=
1if count>mid:
#如果個數》mid,說明重複元素在左邊
right=mid
else
: left=mid+
1return left
參考鏈結
時間複雜度o(nlongn)for迴圈n,二分法logn
LeetCode 287 尋找重複數 二分
給定乙個包含 n 1 個整數的陣列 nums 其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設 nums 只有 乙個重複的整數 找出 這個重複的數 示例 1 輸入 nums 1,3,4,2,2 輸出 2 示例 2 輸入 nums 3,1,3,4,2 輸出 3 示例 3...
LeetCode287 尋找重複數 二分法
給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。示例 1 輸入 1,3,4,2,2 輸出 2 示例 2 輸入 3,1,3,4,2 輸出 3 說明 不能更改原陣列 假設陣列是唯讀的 只能...
leetcode287 尋找重複數 二分法
給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。示例 1 輸入 1 3,4 2,2 輸出 2示例 2 輸入 3 1,3 4,2 輸出 3說明 不能更改原陣列 假設陣列是唯讀的 只能使用...