二分查找解题模版(易懂)
常规:朴素的二分查找(在一维数组中查找一个数,有返回索引,无则返回-1)
int binary_search(int arr[],int n,int val){
int head=0,tail=n-1;
while(head<=tail){
int mid=(head+tail)/2;
if(arr[mid]==val){
return mid;
}else if(arr[mid]>val){
tail=mid-1;
}else{
head=mid+1;
}
}
return -1;
}
变体1:可以总结为00001111问题,查找满足条件的第一个1
int binary_search(int arr[],int n){
int head =0,tail=n-1;
while(head!=tail){//小于也可以,当两者相等时退出
int mid=(head+tail)/2;
if(arr[mid]==0){
head=mid+1;//mid指向的值必不为答案,搜索区间加一
}else{
tail=mid;//mid指向的值可能为答案
}
}
return head/tail;
}
leetcode 题目:35. 搜索插入位置
https://leetcode-cn.com/problems/search-insert-position/
变体2:可以总结为11110000问题,查找满足条件的最后一个1
```cpp
int binary_search(int arr[],int n){
int head =0,tail=n-1;
while(head!=tail){
int mid=(head+tail+1)/2;//注意不同点,加1为了防止左指针死循环
if(arr[mid]==0){
tail=mid-1;//mid指向的值必不为答案,搜索区间减1
}else{
head=mid;//mid指向的值可能为答案
}
}
return head/tail;
}
leetcode题目:
69. x 的平方根](https://leetcode-cn.com/problems/sqrtx/)