-
Notifications
You must be signed in to change notification settings - Fork 1
/
Exercise9_1_1.cpp
108 lines (94 loc) · 1.98 KB
/
Exercise9_1_1.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <iostream>
using namespace std;
#include "Exercise9_1_1.h"
int *nextTarget;
int *nextSecond;
int headTarget = 0;
void prepare(int size)
{
headTarget = 0;
nextTarget = new int[size];
for(int i = 0; i < size; i++)
nextTarget[i] = i + 1;
nextTarget[size-1] = -1;
nextSecond = new int[size];
for(int i = 0; i < size; i++)
nextSecond[i] = -1;
}
void release()
{
delete []nextTarget;
delete []nextSecond;
}
int findSmallest(vector<int> array);
int findSecondSmaller(vector<int> array, int smallestIndex);
int solve9_1_1(vector<int> array)
{
if(array.size() < 2)
return 0;
prepare(array.size());
//运行算法并输出结果
int smallestIndex = findSmallest(array);
int secondSmaller = findSecondSmaller(array, smallestIndex);
release();
return secondSmaller;
}
void pushQueue(int bigIndex, int smallIndex)
{
nextSecond[bigIndex] = nextSecond[smallIndex];
nextSecond[smallIndex] = bigIndex;
}
int compare(vector<int> array, int a, int b)
{
int smallIndex = array[a] < array[b] ? a : b;
int bigIndex = array[a] > array[b] ? a : b;
pushQueue(bigIndex, smallIndex);
return smallIndex;
}
bool twoMoreElementsLeft(int head)
{
return nextTarget[head] != -1;
}
bool getTopTwoElements(int a, int &b)
{
b = nextTarget[a];
if(a == -1 || b == -1)
return false;
}
void removeSmallerOne(int &head, int a, int pre, int b, int ret)
{
if(a == head)
head = ret;
else
nextTarget[pre] = ret;
nextTarget[ret] = nextTarget[b];
}
int findSmallest(vector<int> array)
{
int head = headTarget;
while(twoMoreElementsLeft(head))
{
int a = head, pre, b, ret;
while(getTopTwoElements(a, b))
{
ret = compare(array, a, b);
removeSmallerOne(head, a, pre, b, ret);
a = nextTarget[b];
pre = ret;
}
}
return head;
}
int findSecondSmaller(vector<int> array, int smallestIndex)
{
int head = smallestIndex;
head = nextSecond[head];
int min = array[head];
while(nextSecond[head] != -1)
{
head = nextSecond[head];
if(array[head] < min)
min = array[head];
}
return min;
}