请实现有重复数字的升序数组的二分查找。
输出在数组中第一个大于等于查找值的位置(下标从1开始算起),如果数组中不存在这样的数(指不存在大于等于查找值的数),则输出数组长度加一。
5,4,[1,2,4,4,5]
3
输出位置从1开始计算
5,4,[1,2,3,3,5]
5
虽然数组中没有4,但 5 ≥ 4 ,所以返回5对应的位置,刚好也是5。
# # 二分查找 # @param n int整型 数组长度 # @param v int整型 查找值 # @param a int整型一维数组 有序数组 # @return int整型 # class Solution: def upper_bound_(self , n , v , a ): # write code here l = n+1 for i in range(n): if a[i] >= v: l = i+1 break return l
import math class Solution: def upper_bound_(self , n , v , a ): heads=0 tail=n-1 nums=math.ceil(n/2) flag=0 while heads<=nums and tail>=nums: if a[heads]>=v: flag=heads+1 return flag if a[tail]>=v: flag=tail+1 heads+=1 tail-=1 if flag>0: return flag else: return n+1
# 二分查找 # @param n int整型 数组长度 # @param v int整型 查找值 # @param a int整型一维数组 有序数组 # @return int整型 # class Solution: def upper_bound_(self , n , v , a ): # write code here l = 0 r = n - 1 while l <= r: m = (l + r) >> 1 if a[m] >= v: r = m - 1 else: l = m + 1 return r + 2
# # 二分查找 # @param n int整型 数组长度 # @param v int整型 查找值 # @param a int整型一维数组 有序数组 # @return int整型 # class Solution: def upper_bound_(self , n , v , a ): # write code here if n<1: return 1 if a[-1] < v: return n+1 p = (n-1) // 2 if v <= a[p]: return self.upper_bound_(p, v, a[:p]) else: return p + self.upper_bound_(n-p, v, a[p:])没看到有递归做的,分享一个
# # 二分查找 # @param n int整型 数组长度 # @param v int整型 查找值 # @param a int整型一维数组 有序数组 # @return int整型 # class Solution: def upper_bound_(self , n , v , a ): # write code here if a[n-1]<v: return n+1 def bi_find(): left,right=0,n-1 while left<right: mid = (left+right)//2 if a[mid]==v: tmp = mid-1 while tmp>=left and a[tmp]==a[tmp+1]: tmp-=1 return tmp+2 elif a[mid]>v: right=mid else: left=mid+1 return right+1 return bi_find()
class Solution: def upper_bound_(self , n , v , a ): # write code here lo = 0 hi = len(a) while lo < hi: mi = (lo + hi) // 2 if a[mi] < v: lo = lo+1 # 这里写错了, 应该是 lo = mi + 1 else: hi = mi return lo+1