二分查找总结

117 阅读1分钟

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]

  1. 当目标是找8的起始index:寻找的条件是index之后的数字 ≥ 8。若nums[mid] >= target 则说明target 在 lower range里面,更新high = mid。反之则说明在 higher part, 且不包括当前mid指向的位置,更新low = mid+1。
  2. 寻找8的结束index: 条件是index之前的数都≤8, 若nums[mid] <= target 则说明target再high range,更新low = mid。反之更新high = mid - 1
  3. 由于mid = (low + high) // 2 是下取整,会初始化mid = low,满足check条件 low = mid的的情况而死循环,所以寻找结束index的时候需要调整mid = (low + high + 1) // 2
  4. 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
		 

相关题目: