287 尋找重複數 二分法 雙指標

2022-06-30 19:36:09 字數 1219 閱讀 8948

簡單思路:

1. return sum( nums ) - n*(n+1)/2

2. set()  if num in set: return num              用set 

3. nums.sort()  if nums[i] == nums[i+1] : return nums[ i ]              排序後 相同的數相鄰

本題思路:

1. 由於不能使用外部空間,並且時間複雜度< n^2,自然想到 nlogn, 就是二分法

2. 雙指標 快慢指標法,沒看懂,放棄了 - -  

二分法注意點:

1. 邊界選取用中值左邊界。   mid = low + (high - low)//2    

而不是  mid = (low + high+1)//2

2. 想清楚數數的兩個判斷條件

1) 判斷nums[i] 與 mid的關係時 是小於等於:   if nums[ i ] <= mid : count +=1。

2) 這意味著統計了包括中值以下的所有數,如果重複數在裡面 則必有  count > mid 。  比如 0-7中,mid = 4 ; count = 5; 此時移動上界為4,在0-4中找

if count > mid:  high = mid

else: low = mid + 1

否則在 5-7中找重複的數

3. 最後返回左值,我還沒想清楚

**:class solution:

def findduplicate(self, nums: list[int]) -> int:

# 取左界 6取3 7取4  如果在左邊,則有 4>3(6) 5>4(7) 若在右邊,則左邊等式有 3 >3(6) 4>4 (7)

l = 0

r = len(nums)-1

while lcount = 0

mid = l + (r-l)//2   # 這是取值範圍的中值,不是list的中值

for num in nums:

if num <= mid:

count +=1

if count > mid:

r = mid 

else:

l = mid+1 

print(l,r)

return l

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

leetcode 287 尋找重複數 二分法

此題的二分法與常規的二分法搜尋不一樣。平常我們用到二分法通常是對拍好序後的元素進行二分搜尋,用來搜尋陣列中特定的元素。該提中的二分則是對陣列中元素與給定值之間的大小關係進行二分,首先取陣列中最大和最小值的平均值作為mid值,然後統計整個陣列中比mid小的數的數量,若數量 mid,這說明重複的數一定在...