【算法】【旋转数组最小值】


#include<stdio.h>
#include<iostream>
#include<exception>
using namespace std;
 
class Arrayexception: public std::exception{
	virtual const char *what() const throw()
	{
		return "Error";
	}
};
static int MinRotaryArray(int *arr, int start_index, int end_index)
{
// debug
#if 0
	int i = 0; 
	for(i=start_index;i<=end_index;i++){
		cout << arr[i] << "\t";
	}
	cout << endl;
#endif
	int mid_index = 0;
	int min = 0;
	int ahead = 0;
	int latter = 0;
	if(arr==NULL||start_index>end_index){
		throw Arrayexception();
	}
	mid_index = (start_index+end_index)/2;
	// 一直升序
	if(arr[start_index]<arr[mid_index]&&arr[mid_index]<arr[end_index]){
		min = arr[start_index];
	}else{
		// 单调升序
		if(arr[start_index]<arr[mid_index]){
			min = MinRotaryArray(arr,mid_index, end_index);
		}else if(arr[mid_index]<arr[end_index]){
			min = MinRotaryArray(arr,start_index, mid_index);
		}else {
			if(start_index==mid_index){
				return arr[mid_index]>arr[end_index]?arr[end_index]:arr[mid_index];
			}else{
				// 具有重复元素且元素不为最小值
				ahead = MinRotaryArray(arr,start_index,mid_index);
				latter = MinRotaryArray(arr,mid_index,end_index);
				return ahead>latter?latter:ahead;
			}
		}	
	}

	return min;
}
int main()
{
	// 单调升序
	int arr1[] = {3,14,15,0,12};
	cout << MinRotaryArray(arr1, 0, 4) << endl;
	int arr2[] = {12,14, 1, 7, 9};
	cout << MinRotaryArray(arr2, 0, 4) << endl;
	
	// 有相同元素且最小值为相同元素
	int arr3[] = {3, 4, 5, 1, 1, 2};
	cout << MinRotaryArray(arr3, 0, 4) << endl;
	
	// 有相同元素且最小值不为相同元素
	int arr4[] = {1, 0, 1, 1, 1};
	cout << MinRotaryArray(arr4, 0, 4) << endl;
	
	// 单调升数组
	int arr5[] = {1, 2, 3, 4, 5};
	cout << MinRotaryArray(arr5, 0, 4) << endl;
	
	// 只有一个数字
	int arr6[] = {2};
	cout << MinRotaryArray(arr6, 0, 0) << endl;
	
	// 有相同元素且最小值不为相同元素
	int arr7[] = {3, 4, 5, 1, 2, 2};
	cout << MinRotaryArray(arr7, 0, 4) << endl;
}

猜你喜欢

转载自blog.csdn.net/feifei_csdn/article/details/81106879