首页 > 代码库 > [Leetcode] Search for a Range

[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                 else33                     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                 else49                     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