1. 二分查找时间和空间复杂度
1.1 时间复杂度 --- O(log N)
- 二分查找是通过将现有数组一分为二来执行的。
- 每次调用子例程(或完成一次迭代)时,其大小都会减少到现有部分的一半。
- N 变成 N/2,然后又变成 N/4,然后继续下去,直到找到元素或尺寸变为 1。
- 迭代的最大次数是 log N 。(N 是数组中元素的数目)
1.2 空间复杂度 --- O(1)
2. 模版 I
int binarySearch(int[] nums, int target){
if(nums == null || nums.length == 0)
return -1;
int left = 0, right = nums.length - 1;
while(left <= right){
int mid = left + ((right - left) >> 1);
if(nums[mid] == target){
return mid;
}else if(nums[mid] < target) {
left = mid + 1;
}else {
right = mid - 1;
}
}
return -1;
}
2.1 分析
- 标准的二分查找模板
- 初始条件:left = 0, right = length-1
- 终止:left > right
- 向左查找:right = mid-1
- 向右查找:left = mid+1
2.2 使用场景
- 查找可以通过访问数组中的单个索引来查找指定的target值。
- 查找条件可以在不与元素的两侧进行比较的情况下确定(或使用它周围的特定元素)。
- 不需要后处理,因为每一步中,都在检查是否找到了元素。如果到达末尾,则知道未找到该元素。
3. 模板 II
int binarySearch(int[] nums, int target){
if(nums == null || nums.length == 0)
return -1;
int left = 0, right = nums.length;
while(left < right){
int mid = left + ((right - left) >> 1);
if(nums[mid] == target){
return mid;
}else if(nums[mid] < target) {
left = mid + 1; //mid右邻居
}else {
right = mid;
}
}
//比较mid右邻居是否和目标值相等
if(left != nums.length && nums[left] == target) return left;
return -1;
}
3.1 分析
- 二分查找进阶模板。
- 初始条件:left = 0, right = length
- 终止:left == right
- 向左查找:right = mid
- 向右查找:left = mid+1
3.2 使用场景
- 查找条件需要访问元素的直接右邻居。
- 使用元素的右邻居来确定是否满足条件,并决定是向左还是向右。
- 保证查找空间在每一步中至少有 2 个元素。
- 需要进行后处理。 即当剩下 1 个元素时,循环 / 递归结束。 需要评估剩余元素是否符合条件。
4. 模板 III
int binarySearch(int[] nums, int target) {
if (nums == null || nums.length == 0)
return -1;
int left = 0, right = nums.length - 1;
while (left + 1 < right){
int mid = left + ((right - left) >> 1);
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid;
} else {
right = mid;
}
}
if(nums[left] == target) return left;
if(nums[right] == target) return right;
return -1;
}
4.1 分析
- 二分查找的另一种进阶形式。
- 初始条件:left = 0, right = length-1
- 终止:left + 1 == right
- 向左查找:right = mid
- 向右查找:left = mid
4.2 使用场景
- 搜索条件需要访问元素的直接左右邻居。
- 使用元素的邻居来确定它是向右还是向左。
- 保证查找空间在每个步骤中至少有 3 个元素。
- 需要进行后处理。 当剩下 2 个元素时,循环 / 递归结束。 需要评估其余元素是否符合条件。