python刷題 二分查詢

2022-06-06 02:33:09 字數 2401 閱讀 1524

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

else:

right = mid - 1

return false

nums = [1,2,3,4,5,7]

res = binarysearch(nums, 7)

print(res)

def binarysearch(nums, target):

left = 0

right = len(nums)

while left < right:

mid = (right + left) // 2

if nums[mid] == target:

right = mid

elif nums[mid] < target:

left = mid + 1

else:

right = mid

if left == len(nums):

return -1

if left == 0 and nums[left] != target:

return -1

return left

nums = [1,1,2,2,2,3]

res = binarysearch(nums, 2)

print(res)

def binarysearch(nums, target):

left = 0

right = len(nums)

while left < right:

mid = (right + left) // 2

if nums[mid] == target:

left = mid + 1

elif nums[mid] < target:

left = mid + 1

else:

right = mid

if right >= len(nums) and nums[right - 1] != target:

return -1

return right - 1

nums = [1,2,2,2,2,3,3,4]

res = binarysearch(nums, -2)

print(res)

當陣列中存在重複的元素的時候,我們要返回左右邊界的時候,當查詢到該元素時,我們不能返回true或者fasle,而是要不斷的縮小邊界。

right = sum(weights) + 1 # 船的載重區間[left,right)

while left < right:

mid = (right + left) // 2

if canfinish(weights, d, mid):

right = mid

else:

left = mid + 1

return left

def canfinish(w, d, cap):

i = 0

for day in range(d):

maxcap = cap

while maxcap - w[i] >= 0:

i += 1

if i == len(w):

return true

maxcap = maxcap - w[i]

return false

該題**還有點問題,沒有通過leetcode上的全部用例,掌握思想就好。

最後,首先思考使用 for 迴圈暴力解決問題,觀察**是否如下形式:

for i in range(n):

if isok(i):

return answer

如果是,那麼就可以使用二分搜尋優化搜尋空間:如果要求最小值就是搜尋左側邊界的二分,如果要求最大值就用搜尋右側邊界的二分。

labuladong的演算法小抄

LeetCode刷題總結 二分查詢

leetcode 刷題總結 二分查詢 二分主要是形成自己的 風格就可以了。常用兩種風格 現在偏向於風格一實現了 leetcode35.搜尋插入位置 給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。這個實際上就是手動實現lower...

python刷題之快慢指標與二分查詢

141.環形鍊錶 難度簡單986 給定乙個鍊錶,判斷鍊錶中是否有環。如果鍊錶中有某個節點,可以通過連續跟蹤next指標再次到達,則鍊錶中存在環。為了表示給定鍊錶中的環,我們使用整數pos來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果pos是 1,則在該鍊錶中沒有環。注意 pos不作為引數進行...

leetcode刷題 演算法(4) 二分查詢

尋找乙個數 基本的二分搜尋 因為我們初始化 right nums.length 1 所以決定了我們的 搜尋區間 是 left,right 所以決定了 while left right 同時也決定了 left mid 1 和 right mid 1 因為我們只需找到乙個 target 的索引即可,所以...