面试题8:旋转数组的最小数字
2014-01-13 11:01
381 查看
问题说明:
1.原数组是排序的,将数组开始几位搬到末尾,例如{3,4,5,1,2}是{1,2,3,4,5}的一个旋转;
2.遍历一遍时间复杂度为O(n);
3.充分利用排序信息,二分思想,时间复杂度为O(logn)
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; }
相关文章推荐
- 剑指offer面试题8——旋转数组的最小数字
- 剑指offer——面试题8:旋转数组的最小数字
- 剑指offer面试题8:旋转数组的最小数字
- 【剑指Offer面试题】 九度OJ1386:旋转数组的最小数字
- 剑指Offer_面试题08_旋转数组的最小数字
- 剑指offer-chapter2-面试题8-旋转数组的最小数字(java)
- (未完成)《剑指offer》(面试题8):旋转数组的最小数字
- 剑指offer编程题Java实现——面试题8旋转数组的最小数字
- P66、面试题8:旋转数组的最小数字
- 面试题8:旋转数组的最小数字
- 《剑指offer》面试题8 旋转数组的最小数字
- 剑指Offer(第二版)面试题11:旋转数组的最小数字
- 《剑指Offer》学习笔记--面试题8:旋转数组的最小数字
- 九度OJ1386剑指offer面试题8:旋转数组的最小数字
- 剑指Offer——面试题8:旋转数组的最小数字
- 剑指offer面试题8:旋转数组的最小数字
- 剑指offer——面试题8:旋转数组的最小数字
- 剑指Offer面试题8[旋转数组的最小数字]
- 剑指offer--面试题11:旋转数组的最小数字
- 面试题8 旋转数组的最小数字