您的位置:首页 > 职场人生

面试题8:旋转数组的最小数字

2014-01-13 11:01 381 查看
问题说明:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: