二分查找总结
之前一直以为二分查找很简单,结果(╯︵╰) 每次用都会出错,今天就来总结一下~
怎么记住:
(默认是递增的)
1.if里面与与想要的结果一样,想要 >= 里面就是 >= ,第一个大于等于key说明是往左边找,所以也返回左边,其他同理。
1 #include"iostream" 2 #include"algorithm" 3 using namespace std; 4 const int maxn=1e5+5; 5 int a[maxn]={0,2,5,7,7,10,10,15}; 6 //找小于等于key的 7 int find_less_equal(int L,int R,int key) 8 { 9 int ans=-1; 10 while(L<=R) 11 { 12 int mid=(L+R)>>1; 13 if(a[mid]<=key)L=mid+1; 14 else R=mid-1; 15 } 16 ans=R; 17 return ans; 18 } 19 //找小于key的 20 int find_less_unequal(int L,int R,int key) 21 { 22 int ans=-1; 23 while(L<=R) 24 { 25 int mid=(L+R)>>1; 26 if(a[mid]<key)L=mid+1; 27 else R=mid-1; 28 } 29 ans=R; 30 return ans; 31 } 32 //找大于等于key的 33 int find_greater_equal(int L,int R,int key) 34 { 35 int ans=-1; 36 while(L<=R) 37 { 38 int mid=(L+R)>>1; 39 if(a[mid]>=key)R=mid-1; 40 else L=mid+1; 41 } 42 ans=L; 43 return ans; 44 } 45 //找大于key的 46 int find_greater_unequal(int L,int R,int key) 47 { 48 int ans=-1; 49 while(L<=R) 50 { 51 int mid=(L+R)>>1; 52 if(a[mid]>key)R=mid-1; 53 else L=mid+1; 54 } 55 ans=L; 56 return ans; 57 } 58 int main() 59 { 60 61 }