二分查找
来源:互联网 发布:广州恒大淘宝股价 编辑:程序博客网 时间:2024/06/08 09:13
在一个有序的数组中,用二分查找来寻找目标元素。时间复杂度O(logn)
1、普通版二分查找
不考虑重复元素的情况
int binarySearch(vector<int>& data, int target) { int left = 0, right = data.size() - 1;//注意“-1” while (left <= right) {//注意“<=” int mid = left + (right - left) / 2;//注意防止“溢出” if (data[mid] < target) mid = left + 1; else if (data[mid] > target) mid = right - 1; else return mid; } return -1;}
2、推广-有重复元素
2.1 元素第一次出现的位置
int binarySearch(vector<int>& data, int target) { int left = 0, right = data.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (data[mid] < target) left = mid + 1; else right = mid - 1; } if(left<data.size()&&data[left]==target) return left; return -1;}
测试用例:
{1, 1, 2, 3, 4},1) //0
{1, 2, 3, 4, 4}, 4) //3
{1, 2, 3, 3, 4}, 3) //2
{1, 2, 3, 4, 4}, 0) //-1
{1, 2, 3, 4, 4}, 5) //-1
{1, 1, 1, 1, 1}, 1) //0
2.2 元素最后一次出现的位置
int binarySearch(vector<int>& data, int target) { int left = 0, right = data.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (data[mid] <= target) left = mid + 1; else right = mid - 1; } if (right >= 0 && data[right] == target) return right; return -1;}
测试用例:
{1, 1, 2, 3, 4},1) //1
{1, 2, 3, 4, 4}, 4) //4
{1, 2, 3, 3, 4}, 3) //3
{1, 2, 3, 4, 4}, 0) //-1
{1, 2, 3, 4, 4}, 5) //-1
{1, 1, 1, 1, 1}, 1) //4
2.3第一个大于等于目标值
int binarySearch(vector<int>& data, int target) { int left = 0, right = data.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (data[mid] < target) left = mid + 1; else right = mid - 1; } return left;}
3.4最后一个小于等于目标值
int binarySearch(vector<int>& data, int target) { int left = 0, right = data.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (data[mid] <= target) left = mid + 1; else right = mid - 1; } return right;}
STL
low_bounder
Returns an iterator pointing to the first element in the range [first,last) which does not compare less than val.
第一个大于等于val的位置
upper_bounder
Returns an iterator pointing to the first element in the range [first,last) which compares greater than val.
第一个大于val的位置
阅读全文
0 0
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 分别用Java应用程序和Applet程序实现星星三角形图案的绘制
- java学习笔记-父与子的关系
- java中的多线程
- 编译过程
- 容斥
- 二分查找
- 可以让布局旋转的xml属性
- jersey服务调用python脚本并动态传参
- 面部识别辅助监控系统 人工智能为城市安全保驾护航
- 后台管理系统模板随意切换插件
- 15个常用的javaScript正则表达式
- HenCoder文章汇总
- Android 经典笔记之四: 事件冲突解决思路与方案
- 4G网络可用