码迷,mamicode.com
首页 > 其他好文 > 详细

二分法回顾

时间:2015-06-23 13:37:14      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:acm

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

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. }

二分法回顾

标签:acm

原文地址:http://blog.csdn.net/dojintian/article/details/46604385

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!