251. Flatten 2D Vector
Design and implement an iterator to flatten a 2d vector. It should support the following operations: next and hasNext.
Example:
Vector2D iterator = new Vector2D([[1,2],[3],[4]]);
iterator.next(); // return 1
iterator.next(); // return 2
iterator.next(); // return 3
iterator.hasNext(); // return true
iterator.hasNext(); // return true
iterator.next(); // return 4
iterator.hasNext(); // return false
Notes:
Please remember to RESET your class variables declared in Vector2D, as static/class variables are persisted across multiple test cases. Please see here for more details.
You may assume that next() call will always be valid, that is, there will be at least a next element in the 2d vector when next() is called.
方法1: vector
思路:
和zigzag iterator方法1一样,constructor直接存好一个一维的vector。
class Vector2D {
public:
Vector2D(vector<vector<int>> v) {
for (auto a: v){
result.insert(result.end(), a.begin(), a.end());
}
if (!result.empty()) x = 0;
}
int next() {
return result[x++];
}
bool hasNext() {
return x < result.size();
}
private:
vector<int> result;
int x;
};
/**
* Your Vector2D object will be instantiated and called as such:
* Vector2D* obj = new Vector2D(v);
* int param_1 = obj->next();
* bool param_2 = obj->hasNext();
*/
方法2: iterator
思路:
按照follow up的要求,用iterator来代替行。这里由于OJ保证了不会make invalid call of next,next就不需要check了。而且这里OJ每次call next之前都会call hashNext,那么就用hasNext来整理iterator。逻辑是:如果当前行已经遍历完,就跳到下一行,j清零。如果跳到的行并非end(最后一行的下一行),就表示下面还有数字。注意空vector也会被这个while语句全都跳过。
易错点
1.hasNext的判断逻辑
class Vector2D {
vector<vector<int>>::iterator i, iEnd;
int j = 0;
vector<vector<int>> vec2d;
public:
Vector2D(vector<vector<int>> v) {
vec2d = v;
i = vec2d.begin();
iEnd = vec2d.end();
}
int next() {
hasNext();
return (*i)[j++];
}
bool hasNext() {
while (i != iEnd && j == (*i).size())
i++, j = 0;
return i != iEnd;
}
};