http://oj.leetcode.com/problems/longest-consecutive-sequence/
void swap(vector<int>& v, int i, int j) {
int t = v[i];
v[i] = v[j];
v[j] = t;
}
void find_longest_consequence(void) {
vector<int> v;
v.push_back(100);
v.push_back(4);
v.push_back(200);
v.push_back(200);
v.push_back(1);
v.push_back(3);
v.push_back(1);
v.push_back(3);
v.push_back(2);
for (int i = 0; i < v.size(); i++) {
printf("%d ", v[i]);
}
printf("\n");
map<int, int> s;
int valid_start = 0;
for (int i = 0; i < v.size(); i++) {
if (s.find(v[i]) != s.end()) {
s[v[valid_start]] = i;
swap(v, valid_start++, i);
} else {
s[v[i]] = i;
}
}
int max_con_len = 0;
int valid_end = v.size() - 1;
while (valid_start <= valid_end) {
int key = v[valid_start];
// find (key, key-1, key-2, key-3, ...);
int pre = 1;
do {
map<int, int>::iterator it = s.find(key - pre);
if (it != s.end()) {
swap(v, valid_end--, it->second);
} else {
break;
}
pre++;
} while (valid_start < valid_end);
int next = 1;
do {
map<int, int>::iterator it = s.find(key + next);
if (it != s.end()) {
swap(v, valid_end--, it->second);
} else {
break;
}
next++;
} while (valid_start <= valid_end);
if (next - 1 + pre - 1 + 1 > max_con_len) {
max_con_len = next - 1 + pre - 1 + 1;
}
valid_start++;
}
printf("max_con_len => %d \n", max_con_len);
system("pause");
}