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 的索引即可,所以...