二分法回顾

二分法(自己写的格外放心)

1.lower_bound

注意要是查找一个数组的话 应该从(-1, n)的范围内查找 
r表示出现的最小位置

 
 
  1. void solve(int l, int r)///(l,r]
  2. {
  3. while(l + 1 < r)
  4. {
  5. int mid = (l + r) >> 1;
  6. if(a[mid] >= k) r = mid;
  7. else l = mid;
  8. }
  9. cout<<l<<" "<<r<<endl;
  10. }

2.upper_bound

 
 
  1. void solve(int l, int r)///[l,r)
  2. {
  3. while(l + 1< r)
  4. {
  5. int mid = (l + r) >> 1;
  6. if(a[mid] > k) r = mid;
  7. else l = mid;
  8. }
  9. cout<<l<<" "<<r<<endl;
  10. }

3.变形

 
 
  1. ///将一个递减数列移位 如 6 5 4 3 2 1 -> 4 3 2 1 6 5
  2. ///现在要在移位之后的序列中查找值
  3. ///思路: 二分之后 一定有一段是递减 判断查找值是否在该段内 如果在很容易查找 否则继续查找
  4. int solve(int *a, int value, int l, int r)
  5. {
  6. while(l <= r)
  7. {
  8. int mid = (l + r) >> 1;
  9. if(a[mid] == value)
  10. return mid;
  11. else
  12. {
  13. if(a[l] >= a[mid])
  14. {
  15. if(value<=a[l] && value>=a[mid])
  16. r = mid - 1;
  17. else
  18. l = mid + 1;
  19. }
  20. else
  21. {
  22. if(value<=a[mid] && value>=a[r])
  23. l = mid + 1;
  24. else
  25. r = mid - 1;
  26. }
  27. }
  28. }
  29. }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值