二分查找
在最簡單的形式中,二分查找對具有指定左索引和右索引的連續序列進行操作。這就是所謂的查找空間。二分查找維護查找空間的左、右和中間指示符,並比較查找目標或將查找條件應用於集合的中間值;如果條件不滿足或值不相等,則清除目標不可能存在的那一半,並在剩下的一半上繼續查找,直到成功爲止。如果查以空的一半結束,則無法滿足條件,並且無法找到目標。
二分查找代碼實現
模板一:
題目例題描述:
給定一個 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