四種二分法的區別:
阿新 • • 發佈:2018-12-15
二分法有幾種變形:
585 山脈序列中的最大值
first position of target 457 Classical Binary Search 458 Last Position of Target
他們的區別在於:
mountainSequence 二分也不能太死板呀,邊界可以根據具體問題具體分析。 一定要給left = m1 + 1,要不然會超時 最後返回這個 else: left = m1 right = m2 return max(nums[left], nums[right]) first position of target 只有兩個if else,沒有第三個if 457 Classical Binary Search 任意找一個 else: return mid 458 Last Position of Target else: start = mid
用圖片展示區別
四種方法程式:
二分查詢 · first position of target
class Solution: # @param nums: The integer array # @param target: Target number to find # @return the first position of target in nums, position start from 0 def binarySearch(self, nums, target): # write your code here left, right = 0, len(nums) while left + 1 < right : mid = (left + right) // 2 if nums[mid] < target : left = mid else : right = mid #第一次,最後一次,隨意三種二分查詢都是在這裡變化了 if nums[left] == target : return left elif nums[right] == target : return right return -1;
457 Classical Binary Search
#隨便找一個就行 class Solution: """ @param nums: An integer array sorted in ascending order @param target: An integer @return: An integer """ def findPosition(self, nums, target): # write your code here if not nums or target is None: return -1 start, end = 0, len(nums) - 1 while start + 1 < end: mid = (end + start)//2 if target < nums[mid]: end = mid elif target > nums[mid]: start = mid else: return mid if target == nums[start]: return start if target == nums[end]: return end return -1 my_solution = Solution() A = [1, 2, 2, 4, 5, 5] target = 2 result = my_solution.findPosition(A, target) print('result is',result)
458 Last Position of Target
class Solution:
# @param {int[]} A an integer array sorted in ascending order
# @param {int} target an integer
# @return {int} an integer
def lastPosition(self, A, target):
if not A or target is None:
return -1
start = 0
end = len(A) - 1
while start + 1 < end: #start為啥加1? 為啥不是小於等於; 使用 start < end 無論如何都會出現死迴圈
mid = start + (end - start) // 2 #避免記憶體溢位
if A[mid] < target:
start = mid
elif A[mid] > target:
end = mid
else:
start = mid #A[mid] == target: #return mid 是隨意返回一箇中間位置,這裡要求最後一個位置,所以放棄這種寫法
if target == A[end]:
return end
elif A[start] == target:
return start
else:
return -1
my_solution = Solution()
A = [1, 2, 2, 4, 5, 5]
target = 2
result = my_solution.lastPosition(A, target)
print('result is',result)
585 山脈序列中的最大值
class Solution:
# @param {int[]} nums a mountain sequence which increase firstly and then decrease
# @return {int} then mountain top
def mountainSequence(self, nums):
# Write your code here
left, right = 0, len(nums) - 1
while left + 1 < right:
m1 = left + (right - left) // 2 # m1 is middle
#m1 = right - (right - left) // 2
m2 = right - (right - m1) // 2 #m2 = (right + m1)//2 是右側和陣列中點的中點
#m2 = (right + m1)//2 #這種寫法會報錯
if nums[m1] < nums[m2]:
left = m1 + 1
elif nums[m1] > nums[m2]:
right = m2 - 1
else:
left = m1
right = m2
return max(nums[left], nums[right])
my_solution = Solution()
A = [1, 2, 4, 8, 6, 3]
result = my_solution.mountainSequence(A)
print('result is',result)
認識你是我們的緣分,同學,等等,記得關注我。
微信掃一掃 關注該公眾號