【剑指offer】面试题8:旋转数组中的最小数字

//旋转数组中的最小数字 //题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转,输入一个递增排序的数组,数组旋转数组的最小元素。 //遍历数组一次,找出最小,效率为O(n),显然不是我们想要的结果 //旋转数组特性:1.可能为两个递增的数组,找出较小数组中的开头的那个就是要求输入的元素 //2.既然为排序好的,那我们可不可以尝试一下二分法去查找呢 int Min(int *number, int length) { if (number == NULL || length < 0) { throw new std::exception("Invalid paramenters."); } int index1 = 0; int index2 = length - 1; int indexMid = index1; //二分查找 while (number[index1] >= number[index2]) { if (index1 - index2 == 1) { indexMid = index2; break; } indexMid = (index1 + index2) / 2; if (number[index1] == number[index2] && number[indexMid] == number[index2]) { return MinInorder(number, index1, index2); } if (number[indexMid] <= number[index1]) { index1 = indexMid;//为什么不需要调整为index1=indexMid-1;因为IndexMid有可能就为所求的最小元素,若-1调整后,跳过了最小值。结果肯定是错的 } else if (number[indexMid]<=number[index2]) { index2 = indexMid; } } return number[indexMid]; } int MinInorder(int number[], int index1, int index2) { for (int i = index1; i < index2; ++i) { if (number[i] < number[index1]) { return number[i]; } } return number[index1]; }