题目
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
解题思路
-
二分法前提条件:
a 有序数组
b 无重复元素(返回值唯一) -
边界处理
a 左闭右闭区间class Solution(object): def search(self, nums, target): """ :type nums: List[int] :type target: int :rtype: int """ if not nums: return -1 # 左闭右闭区间 left = 0 # 左初始值 right = len(nums)-1 # 右初始值 while(left<=right): # target在左闭右闭区间[left,right] mid = left + (right - left)//2 # 中间值 if target > nums[mid]: # target在右区间,[mid+1,right] left = mid + 1 elif target < nums[mid]: # target在左区间,[left,mid-1] right = mid - 1 else: return mid # target = nums[mid],mid为下标值,直接返回 return -1 # 没找到target,返回-1
b 左闭右开
class Solution(object): def search(self, nums, target): """ :type nums: List[int] :type target: int :rtype: int """ # 左闭右开区间 left = 0 # 左初始值 right = len(nums) # 右初始值 while(left < right): # target在左闭右开区间[left,right),left=right时区间无意义 mid = left + (right - left)//2 # 中间值 if target > nums[mid]: # target在右区间,[mid+1,right) left = mid + 1 elif target < nums[mid]: # target在左区间,[left,mid) right = mid else: return mid # target = nums[mid],mid为下标值,直接返回 return -1 # 没找到target,返回-1
重点:mid计算方法不变;做好边界处理(弄清结束条件);注意满足条件时区间左右边界值的更新。