• [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 }
  • 相关阅读:
    CF708B
    P4308 [CTSC2011]幸福路径
    P3631 [APIO2011]方格染色
    P1436棋盘分割 记忆化搜索解法
    P2463 [SDOI2008]Sandy的卡片[差分+串拼接后缀数组]
    P2743(poj1743) Musical Themes[差分+后缀数组]
    BZOJ3230 相似子串[后缀数组+二分+st表]
    hdu3518 Boring Counting[后缀排序]
    Robot Framework自动化_Selenium2Library 关键字
    Robot Framework自动化_环境搭建以及第一个用例
  • 原文地址:https://www.cnblogs.com/Phoebe815/p/4261430.html
Copyright © 2020-2023  润新知