剑指offer--找出旋转数组中的最小元素

来源:互联网 发布:上海离婚率数据 编辑:程序博客网 时间:2024/06/02 03:27

把一个数组最开始的元素搬到数组的末尾,称之为数组的旋转,输入一个递增排序的旋转数组,输出旋转数组的最小元素,例如

{3,4,5,1,2}是{1,2,3,4,5}的一个旋转数组,最晓得元素为1。

#include <stdio.h>#include <assert.h>int Min(const int* arr,int right){int left = 0;assert(arr);if (right == 0)return arr[0];while (left < right){int mid = left+ ((right-left)>>1);if (arr [left] == arr [mid] &&arr [right] == arr [mid])return findmin(arr,left,right);if (arr[left] < arr [mid]){            left = mid;}else if (arr[left] > arr[mid]){right = mid;}else {return arr[right];}}}int findmin(const int* arr, int left, int right){int min = arr[left];assert(arr);while (left < right){left++;if (arr[left] < min)min =arr [left];}return min;}int main(){int arr[5]= {3,4,5,1,2};int right = sizeof (arr)/sizeof(arr[0])-1;int ret = Min(arr,right);printf("%d\n",ret);return 0;}

和二分查找法类似,旋转数组可以分为{3,4,5},{1,2}这俩个递增的数组,如果中间元素大于最左边元素,说明中间元素位于左边的递增数组,最小元素应该在第二递增数组中,所以把中间元素赋值为最左边元素,如果中间元素小于最右边元素,说明中间元素位于右边的递增数组,吧这个元素赋值于最右边元素,最后剩两个元素左边就是最大的,右边就是最小的。

但是这里存在一个问题中间元素和最左边最右边均相等时例如{1,0,1,1,1},{1,1,1,0,1}这种情况下上边方法就没法判断,这两个数组都是{0,1,1,1,1}的旋转数组。



1 0
原创粉丝点击