Saturday, March 2, 2013

Search in Rotated Sorted Array

/*
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.
*/
class Solution {
public:
    int searchMid(int A[], int low, int high, int const target){
      if(low>high) return -1;
      int mid = (low+high)/2;
      if(A[mid]==target) return mid;
      if(A[low]==target) return low;
      if(A[high]==target) return high;
     
      if(A[mid] > A[low]){
         if(target > A[low] && target < A[mid]) {
           return searchMid(A, low, mid-1, target);
         }
         else return searchMid(A, mid+1, high, target);
      }
      else{
        if(target > A[mid] && target < A[high]){
          return searchMid(A, mid+1, high, target);
        }
        else return searchMid(A, low, mid-1, target);
      }
    }
    int search(int A[], int n, int target) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if(n<=0) return -1;
        if(target<A[0] && target >A[n-1]) return -1;
       
        return searchMid(A, 0, n-1, target);
    }
};

class Solution {
public:
    int searchMid(int A[], int start, int end, int const target){
      int low = start;
      int high = end;
     
      while(low<=high){
      int mid = (low+high)/2;
      if(A[mid]==target) return mid;
      if(A[low]==target) return low;
      if(A[high]==target) return high;
     
      if(A[mid] > A[low]){
         if(target > A[low] && target < A[mid]) {
           high = mid-1;
         }
         else low = mid+1;
      }
      else{
        if(target > A[mid] && target < A[high]){
          //return searchMid(A, mid+1, high, target);
          low = mid+1;
        }
        else high=mid-1;
      }
      }
     
      return -1;
    }
    int search(int A[], int n, int target) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if(n<=0) return -1;
        if(target<A[0] && target >A[n-1]) return -1;
       
        return searchMid(A, 0, n-1, target);
    }
};

No comments:

Post a Comment