Given a sorted array of integers, find the starting and ending position of a given target value.

Your algorithm's runtime complexity must be in the order of O(log n).

If the target is not found in the array, return [-1, -1].

For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].

Hide Tags

Array Binary Search

 

    这道是变形的二分搜索,写的有点冗余,没有很好的合并在一起。
  方法是先二分搜索到 其中一个target, 然后分别二分搜索边界。
#include <vector>
#include <iostream>
using namespace std; class Solution {
public:
vector<int> searchRange(int A[], int n, int target) {
vector<int > ret(,-);
if(n<) return ret;
int mid = helpFun(A,,n-,target);
if(mid !=-){
ret[]=helpLeft(A,,mid,target);
ret[]=helpRight(A,mid,n-,target);
}
return ret;
} int helpLeft(int *a,int lft, int rgt, int & tar)
{
if(a[lft]==tar) return lft;
if(lft+==rgt) return rgt;
int mid = (lft+rgt)/;
if(a[mid]==tar) return helpLeft(a,lft,mid,tar);
else return helpLeft(a,mid,rgt,tar);
} int helpRight(int *a,int lft, int rgt, int & tar)
{
if(a[rgt]==tar) return rgt;
if(lft+==rgt) return lft;
int mid = (lft+rgt)/;
if(a[mid]==tar) return helpRight(a,mid,rgt,tar);
else return helpRight(a,lft,mid,tar);
} int helpFun(int *a,int lft, int rgt, int & tar)
{
if(lft>rgt) return -;
if(lft == rgt){
if(tar==a[lft]) return lft;
return -;
}
if(lft + == rgt){
if(a[lft]==tar) return lft;
if(a[rgt]==tar) return rgt;
return -;
}
int mid = (lft+rgt)/;
if(a[mid]==tar) return mid;
if(a[mid]<tar) return helpFun(a,mid+,rgt,tar);
else return helpFun(a,lft,mid-,tar);
}
}; int main()
{
int A[]={, , , , , };
Solution sol;
vector<int > ret = sol.searchRange(A,sizeof(A)/sizeof(int),);
cout<<ret[]<<ret[]<<endl;
return ;
}

附件是一份集成的比较好的,思路是一样:

vector<int> searchRange(int a[], int n, int target) {
vector<int> result(,-);
int left = INT_MAX;
int right = INT_MIN;
binSearch(a, , n-, n, target, left, right);
if (left != INT_MAX && right != INT_MIN) {
result[] = left;
result[] = right;
}
return result;
}
void binSearch(int a[], int l ,int h, int n, int target, int& left, int& right) {
if (l > h) return; int m = (l+h)/;
if (a[m] > target) {
binSearch(a,l,m-,n,target, left, right);
} else if (a[m] < target) {
binSearch(a,m+,h,n,target, left, right);
} else {
if (m < left) {
left = m;
if (m > && a[m-] == target) {
binSearch(a,l,m-,n,target,left,m);
}
}
if (m > right) {
right = m;
if (m < n- && a[m+] == target) {
binSearch(a,m+,h,n,target,m,right);
}
}
}
}
 

最新文章

  1. Mybatis 总结
  2. 【前台 】字符串和js对象的相互转化
  3. js弹出对话框的方法总结
  4. SendInput模拟Win(VK_LWIN)键的问题
  5. Ubuntu 安装 Xfce4 桌面
  6. ChartDirector应用笔记(一)
  7. Swift实战-豆瓣电台(一)准备
  8. esp8266烧写机智云固件方法
  9. java获得项目绝对路径
  10. [Falcor] Building Paths Programmatically
  11. Hadoop--序列化
  12. [注意事项&amp;amp;车轮]java源代码 产生局部javadoc api档
  13. DbUtils类基本使用
  14. Unity中的基础光照
  15. (九)UIScrollView和PageControl的分页
  16. 执行C#动态代码
  17. Python常用的数据类型转换
  18. Elastic 基础篇(2)
  19. 为什么要两次调用encodeURI来解决乱码问题
  20. python和jupyter安装

热门文章

  1. 开始体验第一个JAVA程序吧!
  2. 栈--数据结构与算法Javascript描述(4)
  3. saltstack执行远程命令
  4. PHP.24-TP框架商城应用实例-后台1-添加商品功能、钩子函数、在线编辑器、过滤XSS、上传图片并生成缩略图
  5. laravel5.5任务调度
  6. 软引用SoftReference
  7. 剑指Offer - 九度1372 - 最大子向量和(连续子数组的最大和)
  8. 每天一个Linux命令(9):cp命令
  9. Windows下如何解决git&#160;bash的默认home目录路径问题
  10. 生成器 yield, next ,send