簡單思路:
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,這說明重複的數一定在...