package com.interview.leetcode.binarysearch;
/**
* Created_By: stefanie
* Date: 14-11-14
* Time: 下午6:16
*/
public class SearchingVArray {
public static int min(int[] array){
int low = 0;
int high = array.length - 1;
while(low < high){
int mid = (low + high)/2;
int cmp1 = mid > low? array[mid] - array[mid - 1] : -1;
int cmp2 = mid < high? array[mid] - array[mid + 1] : -1;
if(cmp1 < 0 && cmp2 < 0) return array[mid]; //smaller than prev and next, it's the min
else if(cmp1 > 0){ //larger than prev, mid in the increasing part, search in left
high = mid - 1;
} else if(cmp2 > 0){ //larger than next, mid in the decreasing part, search in right
low = mid + 1;
} else { //mid equals with mid+1 and mid-1, move low one step, handle duplication
low++;
}
}
return array[low];
}
public static int find(int[] array, int target){
return find(array, target, 0, array.length - 1);
}
private static int find(int[] array, int target, int low, int high){
if(low > high) return -1;
int mid = (low + high) / 2;
if(target == array[mid]) return array[mid];
else if(target < array[mid]){
int cmp1 = mid > low? array[mid] - array[mid - 1] : -1;
int cmp2 = mid < high? array[mid] - array[mid + 1] : -1;
if(cmp1 < 0 && cmp2 < 0) return -1; //mid is the min;
else if(cmp1 > 0) return find(array, target, low, mid - 1); //larger than prev, mid in the increasing part, search in left
else if(cmp2 > 0) return find(array, target, mid + 1, high); //larger than next, mid in the decreasing part, search in right
else return find(array, target, low + 1, high); //mid equals with mid+1 and mid-1, move low one step, handle duplication
} else {
int found = (array[low] >= target)? find(array, target, low, mid - 1): -1; //binarysearch left
if(found == -1) found = array[high] >= target? find(array, target, mid + 1, high): -1; //no found, binarysearch right
return found;
}
}
}