leectode :34. Find First and Last Position of Element in Sorted Array
Given an array of integers nums sorted in non-decreasing order, find the starting and ending position of a given target value.
If target is not found in the array, return [-1, -1].
You must write an algorithm with O(log n) runtime complexity.
问题:如果有重复的数字,插入在重复数字的前面还是后面?
解析
二分查找的本质是找出一个边界,使得数组被一分为二,一边满足条件,一边不满足。
例如:
target:8, nums: [1, 2, 3, 8, 8 ,9]
- 当目标是找8的起始index:寻找的条件是index之后的数字 ≥ 8。若
nums[mid] >= target则说明target 在 lower range里面,更新high = mid。反之则说明在 higher part, 且不包括当前mid指向的位置,更新low = mid+1。 - 寻找8的结束index: 条件是index之前的数都≤8, 若
nums[mid] <= target则说明target再high range,更新low = mid。反之更新high = mid - 1 - 由于
mid = (low + high) // 2是下取整,会初始化mid = low,满足check条件 low = mid的的情况而死循环,所以寻找结束index的时候需要调整mid = (low + high + 1) // 2 - low == high的时候会退出循环,此时nums[low](nums[hig]也一样)就是要找的数。
模板代码:
low, high = 0, len(num) - 1
while low < high:
mid = (low + high) // 2
if nums[mid] >= target:
high = mid
else:
low = mid + 1
while low < high:
mid = (low + high + 1) // 2
if nums[mid] <= target:
low = mid
else:
high = mid - 1