Given a Vector of Vectors (2D vector), the task is to flatten this 2d vector. Examples:
Input: vector = [[1, 2, 3, 4], [5, 6], [7, 8]] Output: 1 2 3 4 5 6 7 8 Input: vector = [[1, 2], [3], [4, 5, 6, 8]] Output: 1 2 3 4 5 6 8
Algorithm:
- 2D Vector can be flattened using iterators.
- Store starting and ending iterator of every vector in two arrays, iStart & iEnd respectively.
- Create a hasNext() method to check if it has the vector has next element or not.
- Print the current element, if hasNext() yields true
Below is the implementation of the above approach:
CPP
#include <bits/stdc++.h>
using namespace std;
class FlattenVector {
public :
int n;
vector<vector< int >::iterator> iStart;
vector<vector< int >::iterator> iEnd;
int currIndex;
FlattenVector(vector<vector< int > >& v)
{
n = v.size();
currIndex = 0;
iStart.resize(n);
iEnd.resize(n);
for ( int i = 0; i < n; i++) {
iStart[i] = v[i].begin();
iEnd[i] = v[i].end();
}
}
bool hasNext()
{
for ( int i = 0; i < n; i++) {
if (iStart[i] != iEnd[i])
return true ;
}
return false ;
}
int next()
{
if (iStart[currIndex]
== iEnd[currIndex]) {
currIndex++;
return next();
}
else
return *iStart[currIndex]++;
}
};
int main()
{
vector<vector< int > >
v{ { 1, 2 },
{ 3 },
{ 4, 5, 6 },
{ 7, 8, 9, 10 } };
FlattenVector iter(v);
while (iter.hasNext())
cout << iter.next() << " " ;
return 0;
}
|
Output:1 2 3 4 5 6 7 8 9 10
Time Complexity: O(N)
Auxiliary Space: O(N)