题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。
解题:类似二分查找,使用两个指针:left ,right 指向一前一后,一般情况下arr[left]一定大于等于arr[right],除非排序好的数组本身没动过
再使用mid=(left+right)/2 这样,如果 arr[mid]如果>=arr[left]说明在最小值在mid之后,否则在mid之前(包含mid本身)。更新left ,right,继续查找,直到left == right
so the code is as follows:
#include <stdio.h> #include <stdlib.h> #include <assert.h> int findMinOfRotateArray(int arr[],int len) { int left=0,right=len-1,mid=left; assert(arr != NULL && len >0); if(len==1) return arr[0]; //make sure left > right while(arr[left] >= arr[right]) { mid=(left+right)>>1; if(arr[mid]>=arr[left]) { left=mid+1; } else { right=mid; } if(left == right) { break; } } return arr[left]; } int main(void) { int arr[]={1,1,2,3,4,5,6,6,-1,0,0,1}; printf("find it:%d\n",findMinOfRotateArray(arr,sizeof(arr)/sizeof(int))); return 0; }