A night out after long :)
October 28, 2011 5 Comments
So found the following question here (Antonio is awesum
) and worked out a O(n) time solution BUT with O(n) space. I claim the space usage can be brought down to O(1). Anyone game enough to post the O(1) space version?
Problem:
Given an array A of numbers, find a pair of numbers A[i] and A[j], such that A[i] < A[j] and j-i is maximized.
O(n) time O(n) space code
#include <iostream>
#include <string>
#include <utility>
#include <vector>
using namespace std;
int main() {
vector<int> numbers;
int n;
cin >> n;
numbers.resize(n);
for (int i = 0, t; i < n; ++i) {
cin >> t;
numbers[i] = t;
}
vector<pair<int, int> > decr;
decr.push_back(make_pair(numbers[0], 0));
for (int i = 1; i < numbers.size(); ++i) {
if (numbers[i] < decr.back().first) {
decr.push_back(make_pair(numbers[i], i));
}
}
vector<pair<int, int> > incr;
incr.push_back(make_pair(numbers[n-1], n-1));
for (int i = n - 2; i >= 0; --i) {
if (numbers[i] > incr.back().first) {
incr.push_back(make_pair(numbers[i], i));
}
}
reverse(incr.begin(), incr.end());
int iter = min(incr.size(), decr.size());
int max_diff = -1, s_i = -1, s_j = -1;
int i_i = 0, d_i = 0;
for (; i_i < incr.size() && d_i < decr.size();) {
if (incr[i_i].first > decr[d_i].first) {
int tmp_diff = incr[i_i].second - decr[d_i].second;
if (tmp_diff > max_diff) {
max_diff = tmp_diff;
s_i = decr[d_i].second;
s_j = incr[i_i].second;
}
i_i++;
} else if (incr[i_i].first < decr[d_i].first) {
d_i++;
} else {
i_i++;
d_i++;
}
}
cout << "i: " << s_i << " j: " << s_j << endl;
return 0;
}


Recent Activity