地址:http://ac.jobdu.com/problem.php?pid=1386
题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
输入:
输入可能包含多个测试样例,对于每个测试案例,
输入的第一行为一个整数n(1<= n<=1000000):代表旋转数组的元素个数。
输入的第二行包括n个整数,其中每个整数a的范围是(1<=a<=10000000)。
输出:
对应每个测试案例,
输出旋转数组中最小的元素。
样例输入:
5
3 4 5 1 2
样例输出:
1
#include <stdio.h>
int buf[1000000];
int main(){
int n;
while(scanf("%d", &n) != EOF) {
for(int i = 0; i < n; i ++)
scanf("%d", &buf[i]);
int front = 0;
int tail = n - 1;
while(front < tail) {
if(buf[front] <= buf[front + 1])
front ++;
else
break;
if(buf[tail] >= buf[tail - 1])
tail --;
else
break;
}
if(n == 1)
printf("%d\n", buf[0]);
else {
if (front == tail || front > tail)
printf("%d\n", buf[0]);
else if(buf[front + 1] < buf[tail])
printf("%d\n", buf[front + 1]);
else
printf("%d\n", buf[tail]);
}
}
return 0;
}
/**************************************************************
Problem: 1386
Language: C++
Result: Accepted
Time:700 ms
Memory:4928 kb
****************************************************************/
测试用例:
5
1 2 3 4 5
5
1 2 2 3 4
5
2 2 2 2 2
5
2 3 4 5 1
最优解:二分查找。
注意,当a[mid]==a[index1]==a[index2]时,无法再使用二分查找,只能顺序查找。
例如:
5
1 0 1 1 1
#include <stdio.h>
int a[1000000];
int findmin(int index1, int index2, int mid) {
for (int i = index1 + 1; i <= index2; i ++) {
if (a[i] < a[mid])
mid = i;
}
return mid;
}
int main(){
int n;
while(scanf("%d", &n) != EOF) {
for(int i = 0; i < n; i ++)
scanf("%d", &a[i]);
int index1 = 0;
int index2 = n - 1;
int mid = index1;
while(a[index1] >= a[index2]) {//否则,数组已是排好序
mid = (index1 + index2) / 2;
if(index2 - index1 == 1) {
mid = index2;
break;
}
if(a[index1] == a[index2] && a[index1] == a[mid]) {//需要顺序遍历
mid = findmin(index1, index2, mid);
break;
}
else if(a[index1] <= a[mid]) {
index1 = mid;
}
else if(a[index2] >= a[mid]) {
index2 = mid;
}
}
printf("%d\n", a[mid]);
}
return 0;
}
/**************************************************************
Problem: 1386
Language: C++
Result: Accepted
Time:650 ms
Memory:4928 kb
****************************************************************/