Given an array of integers sorted in ascending order, 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].


题目标签:Array

  这道题目给了我们一个 有序序列,其中是有重复的,让我们找到target的范围,如果没有target,就返回 [-1,-1]。既然规定我们用O(log n),那么肯定是利用binary search。问题是,用binary search 是可以找到target, 但是这里需要找到一个范围,中间可能有很多个重复的target。我们可以用两次binary search, 第一次就找到第一个target, 第二次找到最后一个target,这样就可以返回target的范围了。

  怎么来找到第一个target呢,分析一下,如果中间的数字 大于 target, 那么说明target 还在更左边, 我们要把 right = mid - 1。如果中间数字 小于 target, 说明target 在更右边,要把 left = mid + 1。 到这里为止,都是普通的二分法,那么如果中间的数字是等于 target 的呢,因为我们要找到第一个target的位置,所以,就算找到了target, 我们也要向左边移动,因此,要把这个等于的情况加入 大于里面去。因为它们两种情况都是向左边移动。每次找到target 的时候,还需要 记住它的位置,之后一直更新。因为你找到的target 不一定是最左边的,所以要一直更新,最后一次就是最左边的target位置。

  找最后一个target也是同理。

Java Solution:

Runtime beats 79.19%

完成日期:07/14/2017

关键词:Array

关键点:用两次二分法,第一次来找最左边的target,第二次来找最右边的target

 public class Solution
{
public int[] searchRange(int[] nums, int target)
{
int[] res = {-1, -1}; // first binary search to find the first target
int left = 0;
int right = nums.length - 1; while(left <= right)
{
int mid = left + (right - left) / 2;
if(nums[mid] >= target) // if mid one is greater or equal to target
right = mid - 1; // move to left half
else // if mid one is less than target
left = mid + 1; // move to right half if(nums[mid] == target) // update index
res[0] = mid;
} // second binary search to find the last target
right = nums.length - 1; while(left <= right)
{
int mid = left + (right - left) / 2;
if(nums[mid] <= target)
left = mid + 1;
else
right = mid - 1; if(nums[mid] == target)
res[1] = mid;
} return res;
}
}

参考资料:

https://leetcode.com/problems/search-for-a-range/#/discuss

LeetCode 算法题目列表 - LeetCode Algorithms Questions List

最新文章

  1. markdown语法与使用
  2. POJ3249:Test for Job
  3. Linux中总线设备驱动模型及平台设备驱动实例
  4. 判断是否为IE浏览器
  5. php页面之间传值
  6. HTTP协议报文、工作原理及Java中的HTTP通信技术详解
  7. 彻底搞清js中闭包(Closure)的概念
  8. 常用meta整理【转载】
  9. JavaScript 作用域和变量提升
  10. phpmyadmin数据导入最大限制的解决方法
  11. 1.1 selenium 安装
  12. Bitmap与Matrix旋转ImageView
  13. speex库音频降噪(含代码)
  14. 采购订单状态更改处理API
  15. ip地址扫描
  16. Zookeeper Client简介
  17. BZOJ2521[Shoi2010]最小生成树——最小割
  18. webpack——publicPath路径问题
  19. Java多线程 -join用法
  20. POJ-2992 Divisors---组合数求因子数目

热门文章

  1. (java web后端方向)如何让你的简历为你争取到更多的面试机会,内容来自java web轻量级开发面试教程
  2. mysql:视图,触发器,事务,存储过程,函数
  3. pygame 弹力球及其变速的实现
  4. JDBC操作数据库之修改数据
  5. Identifying Duplicate Indexes
  6. oracle查询用户权限及角色(摘)
  7. Spring框架(二)
  8. css之outline实现圆角效果
  9. C++PrimerPlus第6版 第四章——复合类型
  10. Java面向对象 String 基本数据类型对象包装类