c_cpp 递增排序的数组(元素不重复),旋转一定长度后,求数组中最小的数。如{1,2,3,4,5,6},旋转后{4,5,6,1,2, 3},旋转后的数组最小值为1

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 递增排序的数组(元素不重复),旋转一定长度后,求数组中最小的数。如{1,2,3,4,5,6},旋转后{4,5,6,1,2, 3},旋转后的数组最小值为1相关的知识,希望对你有一定的参考价值。

//============================================================================
// Name        : test.cpp
// Author      : will
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include<stdio.h>
#include<stdlib.h>

/*
 * left指向前面递增数组的元素,right指向后面递增数组的元素
 */
int findMin(int arr[],int n){
  	if(arr == NULL || n <= 0){
		return -1;
	}
	int left = 0;
	int right = n-1;
	int mid = left;		//mid初始化为0,如果数组有序,直接返回arr[0]
	while(arr[left] >= arr[right]){
		mid = (left+right)/2;
		if(right-left == 1){
			mid = right;
			break;
		}
		if(arr[mid] >= arr[left]){
			left = mid;
		}else if(arr[mid] <= arr[right]){
			right = mid;
		}
	}
	return arr[mid];
}



/*
 * 如果遇到{0,1,1,1,1}这样数组,旋转之后的数组{1,0,1,1,1},
 * 中间的判断中会出现left,right,mid位置的元素都一样,
 * 这时候无法判断出来mid元素位于前面的递增数组还是位于后面的递增数组,这时候,只能顺序查找
 */
int findMin(int arr[],int n){
	if(arr == NULL || n <= 0){
		return -1;
	}
	int left = 0;
	int right = n-1;
	int mid = left;		//mid初始化为0,如果数组有序,直接返回arr[0]
	while(arr[left] >= arr[right]){
		mid = (left+right)/2;
		if(right-left == 1){
			mid = right;
			break;
		}
		//如果left,right,mid三个元素的值相同,就判断不了当前的递增关系,因此只能顺序查找
		if(arr[mid]==arr[left] && arr[mid]==arr[right]){
			int result = arr[left],i;
			for(i=left+1;left<=right;i++){
				if(result > arr[i])
					result = arr[i];
			}
			return result;
		}
		if(arr[mid] >= arr[left]){
			left = mid;
		}else if(arr[mid] <= arr[right]){
			right = mid;
		}
	}
	return arr[mid];
}

以上是关于c_cpp 递增排序的数组(元素不重复),旋转一定长度后,求数组中最小的数。如{1,2,3,4,5,6},旋转后{4,5,6,1,2, 3},旋转后的数组最小值为1的主要内容,如果未能解决你的问题,请参考以下文章

c语言输入一个递增排序的数组的一个旋转,输出旋转数组中的最小元素

C语言求旋转数组的最小数字,输入一个递增排序的数组的一个旋转,输出其最小元素

c_cpp 搜索已排序和旋转的数组中的元素

二分查找(允许重复元素的有序数组)

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

旋转数组中的元素查找