刷完二分之後的感受,思想很簡單,細節是魔鬼!
前面的部落格已經總結了二分查詢的三個模板,但是在實際刷題中,還是會遇到一些細節上的問題。所以本文在模板基礎上再次探索二分查詢。
1.leetcode69,x的平方根。
def
mysqrt
(x):
l, r =
1, x
while l <= r:
mid = l +
(r-l)//2
if mid * mid == x:
return mid
elif mid * mid < x:
l = mid +
1else
: r = mid -
1return
min(l, r)
#返回l-1也是正確的
2.leetcode162,尋找峰值
該題要求o(logn) 時間複雜度,還是尋找目標值,就是在瘋狂暗示使用二分查詢。
該題給了兩個條件nums[i] ≠ nums[i+1]和nums[-1] = nums[n] = 負無窮。如果nums[mid] > nums[mid+1],此時峰值一定是在mid及mid以左,此時收縮right即可;否則改變left。
def
findpeakelement
(nums)
: l, r =0,
len(nums)-1
#注意此處,與模板不同,為len(nums)-1,後面詳細討論
while l < r:
mid = l +
(r-l)//2
if nums[mid]
> nums[mid+1]
: r = mid #此處為r=mid,因為收縮時mid可能是解,要包含進去
else
: l = mid +
1return l
該題寫法與二分尋找下界模板類似,但是其中細節是有差別的。
收縮時r=mid,其實這裡和模板一樣,但是它的實際意義是,mid有可能是解,所以r收縮到mid,而不是mid-1。
為什麼是nums[mid] > nums[mid+1],而不是nums[mid-1]
3.leetcode153,尋找旋轉排序陣列中的最小值
公升序排序的陣列在預先未知的某個點上進行了旋轉,則其特點是nums[pos]>nums[pos+1],則pos+1位置則為最小值。
def
findmin
(nums)
: l, r =0,
len(nums)-1
#注意此處r也為len(nums)-1
while l < r:
mid = l +
(r-l)//2
if nums[mid]
> nums[right]
:#此時說明mid-right是混亂的不是有序的,解一定在其中。
l = mid +
1else
: r = mid
return nums[l]
該題也類似於模板但又有細節上的不同。 python刷題 二分查詢
def binarysearch nums,target left 0 right len nums 1 while left right mid right left 2 if nums mid target return true elif nums mid target left mid 1 ...
LeetCode刷題總結 二分查詢
leetcode 刷題總結 二分查詢 二分主要是形成自己的 風格就可以了。常用兩種風格 現在偏向於風格一實現了 leetcode35.搜尋插入位置 給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。這個實際上就是手動實現lower...
二分查詢篇
小鈴鐺 2019.10.14 如果沒有eclipse,讓你手寫呢!這種方法用的是遞迴實現 第一種方法 public class binarysearch int middle low high 2 if arr middle key else if arr middle arr high low h...