34. Search for a Range

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

 

本题开始确实能够想到二分查找,但是,却并不知道如何取得最左面和最右面值==target的索引,本题的二分查找是查找两次,一次是找最左面的值==target的索引,一次是找最右面的值==target的索引,拿最左面举例,以上题为例,在7,8之间进行划分,也就是说mid>=和mid<分成两种情况,接下来就是二分查找了,代码如下:

 1 public class Solution {
 2     public int[] searchRange(int[] nums, int target) {
 3         if(nums==null||nums.length==0) return new int[]{-1,-1};
 4         int left = 0;
 5         int right = nums.length-1;
 6         while(left<right){
 7             int mid = left +(right-left)/2;
 8             if(nums[mid]>=target){
 9                 right = mid;
10             }else{
11                 left = mid+1;
12             }
13         }
14         if(nums[left]!=target) return new int[]{-1,-1};
15         int left_index = left;
16         right = nums.length-1;
17         while(left<right){
18             int mid = left+(right-left)/2+1;
19             if(nums[mid]<=target) left  =mid;
20             else{
21                 right = mid-1;
22             }
23         }
24         int right_index = left;
25         return new int[]{left_index,right_index};
26     }
27 }
28 //the time complexity of this one could be O(logn), the space complexity could be O(1);

 

posted @ 2017-02-28 11:06  CodesKiller  阅读(127)  评论(0编辑  收藏  举报