/**97 Answers Given an array of random numbers. Find the longest consecutive sequence. For ex Array 100 3 200 1 2 4 Ans 1 2 3 4 Array 101 2 3 104 5 103 9 102 Ans 101 102 103 104 Can we do it in one go on array using extra space??*/ /**On the one go, use a map to record the beginning and ending of a sub-sequence, merge two sub-sequences to one. The counts are determined by ending-beginning. sequence representation: [beginning, ending] */ #include <map> #include <vector> #include <array> #include <set> #include <algorithm> #include <iterator> #include <iostream> using namespace std; class Solution{ public: vector<int> getLCS(vector<int> const& s){ vector<int> beginning;//store beginnings of sub-sequences vector<int> ending;//store endings of sub-sequences for(int ii = 0; ii < s.size(); ++ii){ int const number = s[ii]; auto it_begin = find(beginning.begin(), beginning.end(), number+1); auto it_end = find(ending.begin(), ending.end(), number-1); if (it_end != ending.end() && it_begin != beginning.end()){//the number is a bridge //sew two sub-sequences together. int const high_seq_pos = distance(beginning.begin(), it_begin); (*it_end) = ending[high_seq_pos]; beginning.erase(it_begin); ending.erase(ending.begin() + high_seq_pos); continue; } if (it_end != ending.end()){//can be appended after one existing sequence ++(*it_end);//should equal to number now. continue; }//it_end if( it_begin != beginning.end()){//can be the new beginning of one existing sequence --(*it_begin);//new begin should be number now continue; } //init case, just insert in the number beginning.push_back(number); ending.push_back(number); }//for ii int maxLCS = 0; int maxPos = 0; for(int ii = 0; ii < beginning.size(); ++ii){ int const localLength = ending[ii] - beginning[ii]; if (maxLCS < localLength){ maxPos = ii; maxLCS = localLength; } } vector<int> result; result.reserve(maxLCS); for(int ii = beginning[maxPos]; ii <= ending[maxPos]; ++ii){ result.push_back(ii); } return result; }//getLCS }; int main(){ cout<<"Hello"<<endl; Solution s; array<int, 6> a = {100,3,200,1,2,4}; vector<int> r = s.getLCS(vector<int>(a.begin(),a.end())); for(int ii = 0; ii < r.size(); ++ii){ cout << r[ii] << endl; } cout<<endl<<endl; array<int, 8> b ={101, 2, 3, 104, 5, 103, 9, 102}; r = s.getLCS(vector<int>(b.begin(), b.end())); for(int ii = 0; ii < r.size(); ++ii){ cout << r[ii] << endl; } cout<<endl<<endl; array<int, 9> c ={6, 2, 8, 104, 8, 103, 9, 102,100}; r = s.getLCS(vector<int>(c.begin(), c.end())); for(int ii = 0; ii < r.size(); ++ii){ cout << r[ii] << endl; } }
Solving problems is fun. But solving the same problem over and over is pain. Once solved, forever solved.
sourcecode
Monday, November 12, 2012
The longest consecutive sequence
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment