[Leetcode] Search for a Range

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

 

Solution:

本题时间复杂度是O(log n),暗示我们应该采用binary search的方法来做此题。

关键点在于有重复的元素,所以需要利用findMostLeft和findMostRight来找到起始和结束的位置。

  

 1 public class Solution {
 2     public int[] searchRange(int[] A, int target) {
 3         int pos=binarySearch(A,target);
 4         
 5         if(pos==-1){
 6             return new int[] {-1,-1};
 7         }else{
 8             int left=-1;
 9             int right=-1;
10             if(pos-1>=0&&A[pos]==A[pos-1]){
11                 left=findMostLeft(A,target,0,pos-1);           
12             }
13             else{
14                 left=pos;   
15             }
16             if(pos+1<=A.length-1&&A[pos]==A[pos+1]){
17                 right=findMostRight(A,target,pos+1,A.length-1);
18                 
19             }else{
20                 right=pos;
21             }
22             return new int[] {left,right};
23         }
24     }
25     public int findMostRight(int[] A,int target,int left,int right){
26         
27         while(left<=right){
28             int mid=left+(right-left)/2;
29             if(A[mid]==target){
30                 if(mid+1<=right&&A[mid]==A[mid+1])
31                     left=mid+1;
32                 else
33                     return mid;
34             }else{
35                 right=mid-1;
36             }
37         }
38         return -1;
39     }
40     public int findMostLeft(int[] A,int target,int left,int right){
41         
42         
43         while(left<=right){
44             int mid=left+(right-left)/2;
45             if(A[mid]==target){
46                 if(mid-1>=left&&A[mid]==A[mid-1])
47                     right=mid-1;
48                 else
49                     return mid;      
50             }else{
51                 left=mid+1;
52             }
53             mid=left+(right-left)/2;
54         }
55         return -1;
56     }
57     public int binarySearch(int[] A, int target){
58         int left=0;
59         int right=A.length-1;
60         int mid=left+(right-left)/2;
61         while(left<=right){
62             
63             
64             if(A[mid]==target){
65                 
66                 return mid;
67             }else if(A[mid]<target){
68                 left=mid+1;
69             }else{
70                 right=mid-1;
71             }
72             mid=left+(right-left)/2;
73         }
74         return -1;
75     }
76 }

 

posted @ 2015-01-30 05:13  Phoebe815  阅读(132)  评论(0编辑  收藏  举报