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:旋转数组的最小数字
旋转数组中的元素查找