问题说明:
1.原数组是排序的,将数组开始几位搬到末尾,例如{3,4,5,1,2}是{1,2,3,4,5}的一个旋转;
2.遍历一遍时间复杂度为O(n);
3.充分利用排序信息,二分思想,时间复杂度为O(logn)
public static int getMinValueIndex(int[] rotate){
int len = 0;
if(rotate == null || (len = rotate.length) == 0){
throw new IllegalArgumentException();
}
// only one element so return 0
if(len <= 1) return 0;
// len >= 2 && rotate[index1] < rotate[index2]
// now isSorted indicates that (int[] rotate) does not rotate any element
int index1 = 0;// this always points first increased array
int index2 = len - 1;// this always points second increased array
boolean isSorted = (rotate[index1] < rotate[index2]);
if(isSorted) return index1;
// len >= 2 && rotate[index1] >= rotate[index2]
int midIndex = 0;
while((index1 < index2) && ((index2 - index1) != 1)){
midIndex = (index1 + index2) >> 1;
boolean isNotJudged = ((rotate[index1] == rotate[index2]) && (rotate[index1] == rotate[midIndex]));
if(isNotJudged) return MinValueOrderIndexOf(rotate, index1,index2);
// rotate[index1] > rotate[index2]
// if isInLeft is false ,so at least
// rotate[midIndex] >= rotate[index1] because midIndex >= index1
// so isInRight does not need because is opposite to isInLeft
boolean isInLeft = (rotate[midIndex] <= rotate[index2]);
boolean isInRight = (rotate[midIndex] >= rotate[index1]);
if(isInLeft){
index2 = midIndex;
}
if(isInRight){
index1 = midIndex;
}
}
//assert index2 -index1 == 1;
return index2;
}
public static int getMinValueOrderIndex(int[] rotate,int fromIndex,int toIndex){
int minIndex = fromIndex;
for(int i = fromIndex; i <= toIndex; i++){
if(rotate[minIndex] > rotate[i]){
minIndex = i;
}
}
return minIndex;
}