二分查找
https://leetcode.com/problems/binary-search/
二分查找是最基本的查找算法,时间复杂度是 Olog(n),其中还会包含很多的变种,比如:
- 第一次出现 target 的位置
- 最后一次出现 target 的位置
- 第一次出现大于 target 的地方
- 最后一次出现大于 target 的地方
应用场景:
- Fork/Join 框架
注意点:
- 终止条件 注意一定是 low <= high
- high 的长度为 数组.length-1
- 中点的选择
public class BinarySearch {
/**
* 二分查找
*
* @annotation 注意边界条件
* @param nums
* @param target
* @return
*/
public static int search(int[] nums, int target) {
if (nums == null)
return -1;
int high = nums.length - 1;
int low = 0;
int mid;
while (low <= high) {
mid = low + (high - low) / 2;
if (nums[mid] == target)
return mid;
if (nums[mid] > target) {
high--;
} else {
low++;
}
}
return -1;
}
public static void main(String[] args) {
System.out.println(search(new int[] { 0, 5, 8, 13, 15, 38 }, 8));
}
}