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

给的那个一个有序数组和一个目标target,找到这个目标在有序数组里的开始和结束的下标。如果不存在就返回 -1 -1。注,如果数组中目标值只有一个,那就返回两个相同的下标。

用binary search找到target   然后再在左边binary search找到左边(包括mid)第一个目标,记录下标。再在右边binary 找到最后一个目标。记录下标。返回。

代码如下:

class Solution {
public:
vector<int> searchRange(int A[], int n, int target)
{
vector<int> wr, ans;
wr.push_back(-1); // 要学会可以用 vector<int> wr(2,-1);直接将其初始化为想要的
wr.push_back(-1);
if(n == 0)
return wr; int l = 0, r = n -1, mid = 0;
while(l <= r)
{
mid = (l+r)/2;
if (A[mid] < target) // 如果mid小于target那么可以把左边一块去掉
{
l = mid + 1;
continue;
}
if (A[mid] > target) // 如果mid大于target那么可以把右边一块去掉
{
r = mid -1;
continue;
}
if (A[mid] == target)// mid 找到了刚好,那就肯定在这里面要有return,如果一直没有找到,跳出while后就返回wr
{
// find start from l to mid,binary search
int start = l, l_r = mid; // l_r指mid左边的最右
while(l <= l_r)
{
int tmp_mid = (l + l_r)/2;
if(A[tmp_mid] != target)
{l = tmp_mid + 1;}
if(A[tmp_mid] == target)
{l_r = tmp_mid - 1; start = tmp_mid;}
}
ans.push_back(start);
// find end from mid to r,binary search
int r_l = mid, End = mid; // r_l指mid右边的最左
while(r_l <= r)
{
int tmp_mid = (r_l + r)/2;
if(A[tmp_mid] != target)
{r = tmp_mid - 1;}
if(A[tmp_mid] == target)
{r_l = tmp_mid + 1; End = tmp_mid;}
}
ans.push_back(End);
return ans;
}
}
return wr;
}
};

最新文章

  1. 关于kali2.0 rolling无法连接数据的解决办法
  2. window.onload和window.document.readystate的探究
  3. Python学习资料汇总
  4. chrome调试文章
  5. Express ejs 3.* layout.ejs
  6. Egret
  7. linux制作livecd
  8. 在java中HttpServletResponse响应中文出现乱码。
  9. leetcode&mdash;Best Time to Buy and Sell stocks III
  10. 构建混合云:配置Azure site to site VPN连接(1)
  11. adb 卸载android系统程序
  12. 【java设计模式】【行为模式Behavioral Pattern】策略模式Strategy Pattern
  13. lua变量作用域
  14. BootstrapTable使用实例
  15. CentOS 7使用yum安装SNMP教程
  16. Log4j 日志记录
  17. 怎么让链式调用setTimeout停止
  18. 使用librtmp进行H264与AAC直播
  19. mysql数据库的数据类型及约束
  20. 那些恶心人的Screen基本概念

热门文章

  1. 使用php+swoole对client数据实时更新(二) (转)
  2. Androids含文档erver结束(工具包 Httputils)两
  3. Initialising Memories
  4. JS前端正则表达式学习笔记(转)
  5. hdu 1025 Constructing Roads In JGShining’s Kingdom 【dp+二分法】
  6. poj 1061青蛙的约会
  7. UBUNTU如何改变mysql默认文件夹数据文件夹
  8. java7 语法糖 之 switch 声明string
  9. TableLayout中stretchColumns、shrinkColumns的使用方法
  10. unity3d NGUI入门(描述和使用插件参数)