旋转数组的最小值

Posted zhou753099943

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旋转数组的最小值相关的知识,希望对你有一定的参考价值。

        题目:把一个数组最开的若干个元素搬到数组的末尾,我们称之为数组的旋转,输入一个递增排序的的数组的一个旋转,输出旋转数组的最小元素,例如:数组{3,4,5,1,2}旋转后为{1,2,3,4,5},该数组的最小值为:1

解析:

        这是最近在看剑指offer,然后就看到这道题了,然后上面的解法有两种:1、也是最容易想到的一种,将数组按升序排序一下,然后数组的第一个数就是最小值,但是它的时间复杂度最好也必须为O(logN),(快排、归并、堆排序)。2、基于这种二分查找的思想,可以在一个局部有序的数组也可以使用二分查找,但剑指offer写出来的代码最开始是没有考虑{1,1,0,1,1,1}这种情况的,即使后面它把这种情况的程序考虑了写出来了,但我个人感觉他写的代码还是有点不够简洁,如果你和我也有同样的想法,那接下来你看我的代码就有意义了,都有注释,这里就不多说,直接上代码

#include <iostream>
#include <assert.h>
using namespace std;

//旋转数组的最小值
//3,4,5,6,7,1,2--->情况1
//6,7,1,2,3,4,5--->情况1
//[]闭区间
int min_key(int *arr,int low,int heigh)
{
	int begin=arr[low];
	int end=arr[heigh];
	while(low <= heigh)
	{
		int mid=low+(heigh-low)/2;
		//1,1,1,1,0,0
		if(arr[low] <= arr[mid] && arr[low] >= arr[heigh])//可以确定最小的数一定在右边
		{
			low=mid;
			if(heigh-low == 1)
				return arr[heigh] <arr[low] ? arr[heigh]:arr[low];
		}//可以确定最小的数一定在左边,而且这是一个连续递增的序列
		else if(arr[low] < arr[mid] && arr[low] < arr[heigh])
			return arr[low];
		//可以确定最小的数一定在右边,而且这是一个连续递减的序列
		else if(arr[low] > arr[mid] && arr[mid] > arr[heigh])
			return arr[heigh];
		//可以确定最小的数一定在左边
		else if(arr[low] >= arr[mid] && arr[mid] <= arr[heigh])
		{
			heigh=mid;
			if(heigh-low == 1)
				return arr[heigh] <arr[low] ? arr[heigh]:arr[low];
		}
	}
	return -1;
}
int min_value(int *arr,int len)
{
	assert(arr !=NULL);
	return min_key(arr,0,len-1);
}

int main()
{
	//int arr[]={3,4,5,6,7,1,2};
	//int arr[]={1,2,3,4,5,6,7};
	//int arr[]={7,6,5,4,3,2};
	//int arr[]={6,7,1,2,3,4};
	//int arr[]={1,1,1,1,0,0};
	//int arr[]={0,1,1,1,0,0};
	int arr[]={1,1,0,1,1,1};
	int len=sizeof(arr)/sizeof(*arr);
	int min=min_value(arr,len);
	cout<<"min is :"<<min<<endl;
	return 0;
}


以上是关于旋转数组的最小值的主要内容,如果未能解决你的问题,请参考以下文章

9.19 在有序旋转数组中找到最小值

剑指offer——旋转数组的最小数字

旋转数组的最小值

旋转数组的最小值

lintcode-寻找旋转排序数组中的最小值 java 需复习

LeetCode第153题—寻找旋转排序数组中的最小值—Python实现