旋转数组的最小元素

来源:互联网 发布:图章设计软件 编辑:程序博客网 时间:2024/05/22 07:05

  题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{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 > rightwhile(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;}

原创粉丝点击