刷題篇 二分查詢再探索

2021-10-06 08:37:59 字數 1589 閱讀 9891

刷完二分之後的感受,思想很簡單,細節是魔鬼!

前面的部落格已經總結了二分查詢的三個模板,但是在實際刷題中,還是會遇到一些細節上的問題。所以本文在模板基礎上再次探索二分查詢。

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...