问题描述:
给定一个排序数组nums(nums中有重复元素)与目标值target,如果 target在nums里出现,则返回target所在区间的左右端点下标,[左端点, 右端点],如果target在nums里未出现,则返回[-1, -1]。

例如:
arr = [2,3,4,4,4],target = 4,最终结果为[2,4]
arr = [2,3,4,5,6],target = 4,最终结果为[2,2]

分析:
最终的结果为一个区间,区间的话肯定有左端点,右端点。

题目是给定了一个有序数组,那么我们的目标就是确认左端点和右端点分别是多少即可。左端点即左侧再有没有比左端点更小的数值了,右端点即右侧再也没有比右端点更大小数值了

确认左端点的过程如下:
arr = [2,3,4,4,4],target = 4,那么需要走一遍二分查找的整个过程
如果我们发现arr[mid] == target,这个时候仍然需要进行判断,即mid == 0 或者arr[mid-1] < target,那么才能够认为此时 left = mid;即此时arr[mid]的左侧已经没有和target相等的节点了。

确认右端点的过程如下:
arr = [2,3,4,4,5],target = 4,那么同样需要走一遍二分查找的整个过程
如果我们发现arr[mid] == target,这个时候仍然需要进行判断,即mid == arr.size()-1 或者arr[mid+1] > target,那么才能够认为此时 right = mid;即此时arr[mid]的右侧已经没有和target相等的节点了。

以上过程实现如下:

pair<int,int> get_target_range(std::vector<int> &arr, int target) {int begin = 0;int end = arr.size() - 1;pair<int,int> range;range.first = -1;range.second = -1;/*计算左边界*/while(begin <= end) {int mid = (begin + end) / 2;if (arr[mid] == target) {if (mid == 0 || arr[mid - 1] < target) {//arr[mid]左侧没有比target更小的range.first = mid;break;} end = mid - 1; //控制左侧的遍历} else if (arr[mid] > target) {end = mid - 1;} else {begin = mid + 1;}}/*计算右边界*/begin = 0;end = arr.size() - 1;while(begin <= end) {int mid = (begin + end) / 2;if (arr[mid] == target) {/*arr[mid]右侧没有比target更大的*/if (mid == arr.size() - 1 || arr[mid + 1] > target) {range.second = mid;break;} begin = mid + 1;} else if (arr[mid] > target) {end = mid - 1;} else {begin = mid + 1;}}return range;
}

测试代码如下:

#include <iostream>
#include <vector>using namespace std;
pair<int,int> get_target_range(std::vector<int> &arr, int target) {int begin = 0;int end = arr.size() - 1;pair<int,int> range;range.first = -1;range.second = -1;while(begin <= end) {int mid = (begin + end) / 2;if (arr[mid] == target) {if (mid == 0 || arr[mid - 1] < target) {range.first = mid;break;} end = mid - 1;} else if (arr[mid] > target) {end = mid - 1;} else {begin = mid + 1;}}begin = 0;end = arr.size() - 1;while(begin <= end) {int mid = (begin + end) / 2;if (arr[mid] == target) {if (mid == arr.size() - 1 || arr[mid + 1] > target) {range.second = mid;break;} begin = mid + 1;} else if (arr[mid] > target) {end = mid - 1;} else {begin = mid + 1;}}return range;
}int main() {std::vector<int> arr1;int n;cin >> n;for (int i = 0;i < n; ++i) {int tmp;cin >> tmp;arr1.push_back(tmp);}int target;cin >> target;cout << "[" << get_target_range(arr1, target).first << "," << get_target_range(arr1, target).second << "]"; return 0;
}

输出如下:

#输入
5
2 3 4 4 4
#输入target
4
#输出
[2,4]#输入
5
4 4 4 4 4
#输入target
4
#输出
[0,4]

二分法:查找区间search for a range相关推荐

  1. 二分法查找--Dichotomy search

    二分法要求被查求的元素有序\ package aaaaa;public class BinarySearch {public static void main(String[] args) {int[ ...

  2. 二分法闭区间开区间,二分法查找 左闭右开,划分区间

    二分法查找 左闭右开,划分区间 二分法查找 左闭右开,划分区间 第一题 class Solution: def missingNumber(self, nums: List[int]) -> i ...

  3. ABAP 二分法查找与SORT排序

    需求场景 需要对内表排序,按降序排列,获取第一行: 二分法查找需要的数据 我按照降序排列后,获取到了第一行,但是通过二分法查找没有获取到 二分法查找 二分查找,对排序数组通过二分区间排除的方法进行快速 ...

  4. 带有哨兵的顺序表查找和二分法查找(折半查找)(java)代码+说明

                                         带有哨兵的顺序表查找和二分法查找(折半查找)(java)代码+说明 一:带有哨兵的顺序表查找 1.算法设计:          ...

  5. mysql实现二分法查找_算法之二分法查找

    二分法检索(binary search)又称折半检索,二分法检索的基本思想是设字典中的元素从小到大有序地存放在数组(array)中, 首先将给定值key与字典中间位置上元素的关键码(key)比较,如果 ...

  6. LeetCode - 34. Search for a Range

    34. Search for a Range Problem's Link -------------------------------------------------------------- ...

  7. iOS 排序算法总结、二分法查找

    iOS 排序算法总结.二分法查找 还有一个:二分插入排序  平均时间O(n2)   稳定 1.插入排序 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个 ...

  8. c语言二分法查找次数,二分法查找

    二分法查找 算法:二分法查找适用于数据量较大,但是数据需要先排好序 (1)确定该区间的中间位置k (2)将查找的值T与array[k]进行比较.若相等,查找成功返回此位置:否则确定新的查找区域,继续二 ...

  9. PHP二分法查找,MYSQL索引即为用了此查找

    算法:当数据量很大适宜采用该方法.采用二分法查找时,数据需是排好序的.主要思想是:(设查找的数组区间为array[low, high]) (1)确定该区间的中间位置K (2)将查找的值T与array[ ...

最新文章

  1. CS架构和BS架构的发展趋势即在图像处理软件中的应用
  2. Python当前进程信息 (os包)
  3. java ls_linux ls 命令
  4. 智能家居——IoT零基础入门篇
  5. js 延迟几秒执行_深入研究 Node.js 的回调队列
  6. Android开发中Edittext设置密码显示隐藏的多种方法
  7. Qt编程之对QGraphicsItem点击右键弹出菜单
  8. 通过设置proxyTable实现调用接口跨域
  9. Windwows7 下安装mysql5
  10. java 打印gc_java – 以编程方式打印启用GC日志记录时通常在JVM出口上打印的堆使用情况...
  11. htcvr设备计算机配置,HTC Vive电脑配置要求多高?享受VR虚拟现实还要一台好电脑!...
  12. python爬虫框架论文开题报告范文_论文开题报告范文
  13. mac 硬盘读写速度测试 软件,MAC硬盘速度测试技巧
  14. 智课雅思词汇---二十、前缀syn-sym-syl是什么意思
  15. Topic 18. 临床预测模型之缺失值插补方法
  16. symbian android,Symbian^3对比
  17. 如何禁用win10的水果输入法
  18. linux常用面试题
  19. hping3使用手册
  20. 使用离线语音识别实现对设备经纬度参数的设置

热门文章

  1. ES6深入学习记录(一)class方法相关
  2. Windows Phone开发(39):漫谈关键帧动画上篇 转:http://blog.csdn.net/tcjiaan/article/details/7550506...
  3. 使用.NET FileSystemWatcher对象监控磁盘文件目录的改变
  4. C# 运算符的优先级
  5. NHibernate初学体验记
  6. 最近用到的一些方法技巧
  7. 《OpenCV3编程入门》学习笔记9 直方图与匹配(四)反向投影(back projection)
  8. 型人格 disc测试_3号,成就型人格的专业和职业选择@九型人格测试
  9. 自走棋电脑版_2019年的爆款自走棋玩法,百花齐放过后,却身陷“变现烦恼”...
  10. oracle实例没有连到监听上6,oracle LISTENER未监听到oracle实例问题解决