287 尋找重複數 二分方法

2021-10-04 22:43:07 字數 953 閱讀 1016

給定乙個 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說明 不能更改原陣列 假設陣列是唯讀的 只能使用...