二分查找
在最简单的形式中,二分查找对具有指定左索引和右索引的连续序列进行操作。这就是所谓的查找空间。二分查找维护查找空间的左、右和中间指示符,并比较查找目标或将查找条件应用于集合的中间值;如果条件不满足或值不相等,则清除目标不可能存在的那一半,并在剩下的一半上继续查找,直到成功为止。如果查以空的一半结束,则无法满足条件,并且无法找到目标。
二分查找代码实现
模板一:
题目例题描述:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
完整的可运行的C++代码如下(递归版):
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int search(vector<int>& nums, int target) {
int len=nums.size();
if(len<1)
return -1;
return Binary_search(nums,0,len-1,target);
}
//核心代码
int Binary_search(vector<int>& nums,int left,int right,int target){
if(left>right)
return -1;
int mid=left+(right-left)/2;
if(nums[mid]==target)
return mid;
else if(nums[mid]<target){
return Binary_search(nums,mid+1,right,target);
}else{
return Binary_search(nums,left,mid-1,target);
}
}
};
int main(){
vector<int> nums{-1,0,3,5,9,12};
Solution s;
cout<<s.search(nums,9)<<endl;
return 0;
}
迭代版
int binarySearch(vector<int>& nums, int target){
if(nums.size() == 0)
return -1;
int left = 0, right = nums.size() - 1;
while(left <= right){
// Prevent (left + right) overflow
int mid = left + (right - left) / 2;
if(nums[mid] == target){ return mid; }
else if(nums[mid] < target) { left = mid + 1; }
else { right = mid - 1; }
}
// End Condition: left > right
return -1;
}
此模板 是二分查找的最基础和最基本的形式。这是一个标准的二分查找模板,用于查找可以通过访问数组中的单个索引来确定的元素或条件。
总结模板:
初始条件:left = 0, right = length-1
终止:left > right
向左查找:right = mid-1
向右查找:left = mid+1