假如存在一个数组[1,9],这个数组是1到9有序排列,不重复的9个数。给出一个target,假设target=8,输出target在数组中的索引值。
通过二分法来解决:
这就是整个二分法的算法思路了,就是不断的对半缩短检索区域。因此二分法也叫折半搜索(binary search)。
力扣.704二分查找:
题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
class Solution:
def search(self, nums: List[int], target: int) -> int:
n = len(nums)
left = 0
right = n-1
while left<=right:
middle = left+(right-left)//2 # 防止溢出 等同于(left + right)/2
if nums[middle] > target:
right = middle-1
elif nums[middle] < target:
left = middle+1
else:
return middle
return -1
当然也可以抖机灵
class Solution:
def search(self, nums: List[int], target: int) -> int:
if target in nums:
return nums.index(target)
else:
return -1
力扣.69Sqrt(x):
题目:给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
class Solution:
def mySqrt(self, x: int) -> int:
left,right=0,x
if x==0:return 0
while left<=right:
mid = left+(right-left)//2
if mid*mid == x:
return mid
elif mid*mid>x:
right = mid-1
else:
left = mid+1
return left-1
力扣.367有效的完全平方数:
题目:给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
注意:不要 使用任何内置的库函数,如 sqrt 。
class Solution:
def isPerfectSquare(self, num: int) -> bool:
left,right = 0,num
while left<=right:
mid = left+(right-left)//2
if mid*mid == num:
return True
elif mid*mid<num:
left = mid+1
else:
right = mid-1
return False
力扣.34在排序数组中查找元素的第一个和最后一个位置:
题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。(有难度)
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
if target not in nums:return [-1,-1]
path = []
left,right=0,len(nums)-1
# 确定左边界
while left<right:
mid = (left+right)//2
if nums[mid]>=target:
right = mid
else:
left = mid+1
path.append(left)
if nums[left] != target:
return [-1,-1]
left,right=0,len(nums)-1
#确定右边界
while left<right:
mid = (left+right+1)//2
if nums[mid]<=target:
left = mid
else:
right = mid-1
path.append(right)
return path
完~