题目描述

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

你的算法时间复杂度必须是 O(log n) 级别。

如果数组中不存在目标值,返回 [-1, -1]

示例 1:

输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]

示例 2:

输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]

解题思路

利用二分查找的思想,分别找到数组中target出现的首位置和末位置,其中找首位置的步骤如下:

  • 若数组中点值小于target,继续在中点值之后的数组查找
  • 若数组中点值大于或等于target,说明前面数组中还可能有target,继续在中点值之前的数组查找
  • 最后当首位置大于末位置时,首位置即为数组中第一个大于或等于target的值
  • 若首位置上的数与target相等,则返回该位置,否则返回-1

同理可得到找末位置的步骤。

代码

 class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
if(nums.empty())
return {-,-};
int first=findFirst(nums,target);
int last=findLast(nums,target);
return {first,last};
}
int findFirst(vector<int>& nums, int target){
int f=,l=nums.size()-;
while(f<=l){
int m=(f+l)/;
if(nums[m]<target)
f=m+;
else
l=m-;
}
if(f<nums.size()&&nums[f]==target)
return f;
return -;
}
int findLast(vector<int>& nums, int target){
int f=,l=nums.size()-;
while(f<=l){
int m=(f+l)/;
if(nums[m]<=target)
f=m+;
else
l=m-;
}
if(l>=&&nums[l]==target)
return l;
return -;
}
};

最新文章

  1. (免量产,免格式化)手动将PE安装到移动硬盘/U盘或无系统硬盘!
  2. struts2拦截器+监听器 .
  3. BAT批量处理 命令
  4. 使用Jquery解析Json基础知识
  5. Android--自动搜索提示
  6. Giew与checkBox的结合
  7. 动漫网站基于jquery的横向手风琴特效
  8. topcoder srm 610 div2 250
  9. C51指针小结
  10. js调试
  11. 论山寨手机与Android联姻 【4】手机产业链
  12. printk
  13. Centos6.5部署vsftpd+mysql认证
  14. 安装pycrypto2.6.1报错
  15. JSON与XML之间的转换
  16. 怎样在winform中上传图片
  17. [Windows Hook] 屏蔽键盘按键
  18. 全国高校绿色计算大赛 预赛第一阶段(C++)第3关:旋转数组
  19. Linux下eclipse编译C/C++程序遇到 undefined reference to `pthread_create&#39;的异常解决办法
  20. Javascript常用语法 (一)

热门文章

  1. ubuntu 16.04下ssh访问提示错误
  2. Halide安装指南release版本
  3. 自己实现一个简化版Mybatis框架
  4. rabbitmq一键部署脚本
  5. 15、Nginx动静分离实战
  6. orm之peewee
  7. 网络初级篇之OSPF(一)原理
  8. 08ServletContext
  9. 牛客练习赛47 DongDong数颜色 (莫队算法)
  10. 读《JavaScript面向对象编程指南》(二)