码迷,mamicode.com
首页 > 其他好文 > 详细

[Leetcode] Search for a Range

时间:2015-01-30 06:41:04      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

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 }

 

[Leetcode] Search for a Range

标签:

原文地址:http://www.cnblogs.com/Phoebe815/p/4261430.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!