-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy path08_MInNumberInRotatedArray.cpp
69 lines (64 loc) · 1.51 KB
/
08_MInNumberInRotatedArray.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <stdlib.h>
#include <stdio.h>
#define MAX 1000001
int MinInOrder(int *numbers, int index1, int index2)
{
int i, result;
result = numbers[index1];
for (i = index1 + 1; i <= index2; i ++)
{
if (result > numbers[i])
result = numbers[i];
}
return result;
}
int Min(int *numbers, int length, int *min_num)
{
int index1, index2, indexMid;
if (numbers == NULL || length <= 0)
return -1;
index1 = 0;
index2 = length - 1;
indexMid = index1;
while (numbers[index1] >= numbers[index2])
{
if (index2 - index1 == 1)
{
indexMid = index2;
break;
}
indexMid = (index1 + index2) / 2;
if (numbers[index1] == numbers[indexMid] && numbers[index2] == numbers[indexMid])
{
*min_num = MinInOrder(numbers, index1, index2);
return 0;
}
if (numbers[indexMid] >= numbers[index1])
index1 = indexMid;
else if (numbers[indexMid] <= numbers[index2])
index2 = indexMid;
}
*min_num = numbers[indexMid];
return 0;
}
int main(void)
{
int numbers[MAX];
int n, tmp, len, min_num;
while(scanf("%d", &n) != EOF)
{
len = 0;
while (len < n)
{
scanf("%d", &tmp);
numbers[len] = tmp;
len ++;
}
tmp = Min(numbers, n, &min_num);
if (tmp == -1)
continue;
else
printf("%d\n", min_num);
}
return 0;
}