package com.interview.leetcode.binarysearch;
/**
* Created_By: stefanie
* Date: 14-11-14
* Time: 下午4:41
*/
public class SearchingRotatedArray {
public static int min(int[] array){
int low = 0;
int high = array.length - 1;
while(low < high){
while(low < high && array[low] == array[high]) high--; //handle duplication
int mid = (low + high) / 2;
if(array[mid] > array[mid + 1]) return array[mid + 1]; //find max, return min
else if(array[mid] > array[high]) low = mid + 1;
else high = mid;
}
return array[0];
}
public static int max(int[] array){
int low = 0;
int high = array.length - 1;
while(low < high){
while(low < high && array[low] == array[high]) low++; //handle duplication
int mid = (low + high) / 2;
if(array[mid] > array[mid + 1]) return array[mid]; //return max
else if(array[mid] > array[high]) low = mid + 1;
else high = mid;
}
return array[array.length - 1];
}
public static int find(int[] array, int target){
int low = 0;
int high = array.length - 1;
while(low <= high){
while(low < high && array[low] == array[high]) high--; //if array[low] = array[high] move high to a element not equals to low, to avoid can't determine left or right in the following case
int mid = (low + high) / 2;
if(target == array[mid]) return mid;
if(target < array[mid]){
if(array[low] <= array[mid] && target < array[low]) low = mid + 1; //when left part is in order, and target < array[low], should binarysearch in the right part
else high = mid - 1; //binarysearch in the left part
} else {
if(array[high] >= array[mid] && target > array[high]) high = mid - 1; //when right part is in order, and target > array[high], should binarysearch in the left part
else low = mid + 1; //binarysearch in the right part
}
}
return -1;
}
}