• [LintCode] Search in Rotated Sorted Array


    Suppose a sorted array is rotated at some pivot unknown to you beforehand.

    (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

    You are given a target value to search. If found in the array return its index, otherwise return -1.

    You may assume no duplicate exists in the array.

    Example

    For [4, 5, 1, 2, 3] and target=1, return 2.

    For [4, 5, 1, 2, 3] and target=0, return -1.

    Challenge 

    O(logN) time

    A rotated sorted array has a split point where one side of this point is sorted, the other side is not.

     1 public class Solution {
     2     /** 
     3      *@param A : an integer rotated sorted array
     4      *@param target :  an integer to be searched
     5      *return : an integer
     6      */
     7     public int search(int[] A, int target) {
     8         if(A == null || A.length == 0)
     9         {
    10             return -1;
    11         }
    12         return searchHelper(A, target, 0, A.length - 1);
    13     }
    14     
    15     private int searchHelper(int[] A, int target, int startIdx, int endIdx)
    16     {
    17         if(startIdx > endIdx)
    18         {
    19             return -1;
    20         }
    21         
    22         int mid = startIdx + (endIdx - startIdx) / 2;
    23         
    24         if(A[mid] == target)
    25         {
    26             return mid;
    27         }
    28         //right half sorted
    29         else if(A[mid] < A[endIdx])
    30         {
    31             //if target in range of right half
    32             if(target > A[mid] && target <= A[endIdx])
    33             {
    34                 return searchHelper(A, target, mid + 1, endIdx);
    35             }
    36             //search left half otherwise 
    37             else
    38             {
    39                 return searchHelper(A, target, startIdx, mid - 1);
    40             }
    41         }
    42         //left half sorted 
    43         else
    44         {
    45             //if target in range of left half
    46             if(target >= A[startIdx] && target < A[mid])
    47             {
    48                 return searchHelper(A, target, startIdx, mid - 1);
    49             }
    50             //search right half otherwise
    51             else
    52             {
    53                 return searchHelper(A, target, mid + 1, endIdx);
    54             }
    55         }
    56     }
    57 }

    Related Problems

    Search in Rotated Sorted Array II

    Search a 2D Matrix

  • 相关阅读:
    HDU
    洛谷- P1306 斐波那契公约数
    HDU
    HDU
    POJ3321
    SPOJ
    HDU
    POJ 1236 Network of Schools
    POJ-3169 Layout (差分约束+SPFA)
    POJ-1062 昂贵的聘礼 (最短路)
  • 原文地址:https://www.cnblogs.com/lz87/p/7494209.html
Copyright © 2020-2023  润新知