leecode 中有很多binary search的题。一般而言,当一个题目出现以下特性时,你就应该立即联想到它可能需要使用二分查找:
- 待查找的数组有序或者部分有序
- 要求时间复杂度低于O(n),或者直接要求时间复杂度为O(log n)
二叉搜索的思想很好理解,但是其中的边界条件却很繁琐,很多时候写出来的代码不能很好的处理边界条件。例如:
同时,二叉搜索有很多的变体,例如:
对于这些条件和边界的总结,强烈推荐下面这篇文章,可以说是山高月小,水落石出。
https://leetcode-cn.com/problems/binary-search/solution/er-fen-cha-zhao-xiang-jie-by-labuladong/
下面我们来看具体的题目。
首先是一个最原始和典型的二叉搜索的题:
https://leetcode.com/problems/binary-search/
这道题很典型,我们采用两种方式进行求解,首先是
public int search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
// right取值在数组范围内,为[left, right], 左闭右闭,
// 决定了while循环时采用left <= right
while(left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] =