- 题目描述:
-
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
- 输入:
-
输入可能包含多个测试样例,对于每个测试案例,
输入的第一行为一个整数n(1<= n<=1000000):代表旋转数组的元素个数。
输入的第二行包括n个整数,其中每个整数a的范围是(1<=a<=10000000)。
- 输出:
-
对应每个测试案例,
输出旋转数组中最小的元素。
- 样例输入:
-
53 4 5 1 2
- 样例输出:
-
1
推荐指数:※※
来源:http://ac.jobdu.com/problem.php?pid=1386
近似于二分法,mid使用上注意下。注意: 1 2 3 4, 1 1 0 1等情况。
这也是《剑指offer》的题目。
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int find_min(const int *arr,int len)
{
int low=0,high=len-1;
while(low<high){
int mid=(low+high)/2;
if(arr[mid]>arr[low]&&arr[mid]&&arr[mid]>arr[high])//
low=mid;
else if(arr[mid]<arr[low]&&arr[mid]<arr[high])
high=mid;
else{
int i=low;
while(i<=high){
if(arr[i]<arr[low])
return arr[i];
i++;
}
return arr[low];
}
}
return arr[low];
}
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF){;
int *arr=new int [n];
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
int min_num=find_min(arr,n);
printf("%d\n",min_num);
}
return 0;
}

本文介绍了一种高效算法,用于从旋转过的递增排序数组中找出最小元素。通过二分法的思想,在O(log n)的时间复杂度内完成查找,特别讨论了特殊情况的处理。
1395

被折叠的 条评论
为什么被折叠?



