zoukankan      html  css  js  c++  java
  • [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 }
  • 相关阅读:
    C# 不用添加WebService引用,调用WebService方法
    贪心 & 动态规划
    trie树 讲解 (转载)
    poj 2151 Check the difficulty of problems (检查问题的难度)
    poj 2513 Colored Sticks 彩色棒
    poj1442 Black Box 栈和优先队列
    啦啦啦
    poj 1265 Area(pick定理)
    poj 2418 Hardwood Species (trie树)
    poj 1836 Alignment 排队
  • 原文地址:https://www.cnblogs.com/Phoebe815/p/4261430.html
Copyright © 2011-2022 走看看