二分法

最后都变了- 提交于 2020-01-19 18:50:43

1. 二分查找法代码实现:

 1 // 二分查找法
 2 // A[]为严格递增序列,left为二分下界,x为欲查询的数
 3 // 二分区间为左闭右闭的[left, right], 传入的初值为[0, n-1]
 4 int binarySearch(int A[], int left, int right, int x){
 5     int mid;
 6     while (left <= right){
 7         mid = (left + right) / 2;  // mid = left + (right - left) / 2;
 8         if (A[mid] == x){
 9             return mid;
10         }
11         else if (A[mid] > x){
12             right = mid - 1;
13         }
14         else if (A[mid] < x){
15             left = mid + 1;
16         }
17     }
18 
19     return -1;
20 }

 

2. 二分法求序列中第一个大于等于x的元素的位置L

 1 // 求序列中第一个大于等于x的元素的位置L
 2 // 二分上下界为左闭右闭的[left, right], 传入的初值为[0, n]
 3 int lower_bound(int A[], int left, int right, int x){
 4     int mid;
 5     while (left < right){
 6         mid = (left + right) / 2;        
 7         if (A[mid] >= x){
 8             right = mid;
 9         }
10         else{
11             left = mid + 1;
12         }
13     }
14     return left;            // 返回夹出来的位置
15 }

 

3. 二分法求序列中第一个大于x 的元素的位置R

 1 int upper_bound(int A[], int left, int right, int x){
 2     int mid;
 3     while (left < right){
 4         mid = (left + right) / 2;
 5         if (A[mid] > x){
 6             right = mid;
 7         }
 8         else{
 9             left = mid + 1;
10         }
11     }
12     return left;
13 }

 

4. 二分法解决“寻找有序序列第一个满足某条件的元素的位置”问题的固定模板

 1 // 二分区间为左闭右闭[left, right], 初值必须能覆盖解的所有取值
 2 int solve(int left, int right){
 3     int mid;
 4     while (left < right){
 5         mid = (left + right) / 2;
 6         if (条件成立){
 7             right = mid;
 8         }
 9         else{
10             left = mid + 1;
11         }
12     }
13 
14     return left;
15 }

 

5. 二分法求根号2的近似值

 1 double calSqrt(){
 2     double left = 1, right = 2, mid;        // [left, right] = [1, 2]
 3     while (right - left > eps){
 4         mid = (left + right) /2;
 5         if (f(mid) > 2){
 6             right = mid;
 7         }
 8         else{
 9             left = mid;
10         }
11     }
12 
13     return mid;
14 }

 

6. 二分法求某个单调函数根的近似值

 1 // 利用二分法求单调函数的根
 2 const double eps2 = 1e-5;
 3 double f(double x){
 4     return ...;            // 写函数的表达式
 5 }
 6 
 7 double solve(double L, double R){
 8     double left = L, right = R, mid;
 9     while (right - left > eps2){
10         mid = (left + right) / 2;
11         if (f(mid) > 0){
12             right = mid;
13         }
14         else{
15             left = mid;
16         }
17     }
18     return mid;
19 }            

 

7. 快速幂的递归写法(二分法实现)

 1 // 快速幂的递归写法
 2 typedef long long LL;
 3 // a^b & m
 4 LL binaryPow(LL a, LL b, LL m){
 5     if (b == 0)
 6         return 1;
 7     if (b & 1){            // 如果b为奇数
 8         return a * binaryPow(a, b - 1, m) % m;
 9     }
10     else{
11         LL mu = binaryPow(a, b / 2, m);
12         return mu * mu % m;
13     }
14 }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!