1 二分法
1.1二分查找
#include<bits/stdc++.h>
using namespace std;
//二分查找,当L大于R时候停下
bool find(vector<int>&arr,int num)
{
if(arr.empty())
return false;
int l=0;
int r=arr.size()-1;
while(l<=r)
{
mid=l+(r-l)/2;
if(arr[mid]==num)
return true;
else if(arr[mid]<num)
l=mid+1;
else
r=mid-1;
}
return false;
}
1.2有序数组中找到>=num最左的位置
#include<vector>
using namespace std;
int mostLeftNoLessNumIndex(vector<int>& arr,int num){
if(arr.empty())
return -1;
int l=0;
int r=arr.size()-1;
int ans=-1;
while(l<=r)
{
int mid=l+(r-l)/2;
if(arr[mid]>=num){
ans=mid;
r=mid-1;
}
else
l=mid+1
}
return ans;
}
1.3有序数组中找到<=num最右的位置
#include <vector>
using namespace std;
int nearestIndex(vector<int>& arr, int value) {
int L = 0;
int R = arr.size() - 1;
int index = -1; // 记录最右的对号
while (L <= R) {
int mid = L + ((R - L) >> 1);
if (arr[mid] <= value) {
index = mid;
L = mid + 1;
} else {
R = mid - 1;
}
}
return index;
}
1.4局部最小值问题
此时数组不需要排序,只要第二个数小于等于第一个数,且倒数第二个数比倒数第一个数小,此范围内一定有最小值
#include<vector>
using namespace std;
int oneMinIndex(vector<int>& arr){
if(arr.empty()){
return -1;
}
int n=arr.size();
if(n==1)
return 0;
if(arr[0]<arr[1])
return 0;
if(arr[n-1]<arr[n-2])
return n-1;
int l=0;
int r=n-1;
while(l<r-1)//最少有三个数才能确定局部最小
{
int mid=(r+l)/2;
if(arr[mid]<arr[mid-1]&&arr[mid]<arr[mid+1])
{
return mid;
}
else
{
if(arr[mid]>arr[mid-1])
r=mid-1;
else
l=mid+1;
}
}
return arr[l]<arr[r]?l:r;
}