251. 展开二维向量 🔒
题目描述
请设计并实现一个能够展开二维向量的迭代器。该迭代器需要支持 next
和 hasNext
两种操作。
实现 Vector2D
类:
Vector2D(int[][] vec)
使用二维向量vec
初始化对象next()
从二维向量返回下一个元素并将指针移动到下一个位置。你可以假设对next
的所有调用都是合法的。hasNext()
当向量中还有元素返回true
,否则返回false
。
示例 1:
输入: ["Vector2D", "next", "next", "next", "hasNext", "hasNext", "next", "hasNext"] [[[[1, 2], [3], [4]]], [], [], [], [], [], [], []] 输出: [null, 1, 2, 3, true, true, 4, false] 解释: Vector2D vector2D = new Vector2D([[1, 2], [3], [4]]); vector2D.next(); // return 1 vector2D.next(); // return 2 vector2D.next(); // return 3 vector2D.hasNext(); // return True vector2D.hasNext(); // return True vector2D.next(); // return 4 vector2D.hasNext(); // return False
提示:
0 <= vec.length <= 200
0 <= vec[i].length <= 500
-500 <= vec[i][j] <= 500
- 最多调用
next
和hasNext
105
次。
进阶:尝试在代码中仅使用 C++ 提供的迭代器 或 Java 提供的迭代器。
解法
方法一:双指针
我们定义两个指针 $i$ 和 $j$,分别指向当前二维向量的行和列,初始时 $i = 0$,$j = 0$。
接下来,我们设计一个函数 $forward()$,用于将 $i$ 和 $j$ 向后移动,直到指向一个非空的元素。
每次调用 next
方法时,我们先调用 $forward()$,然后返回当前指向的元素,最后将 $j$ 向后移动一位。
每次调用 hasNext
方法时,我们先调用 $forward()$,然后判断 $i$ 是否小于二维向量的行数,如果是,则返回 true
,否则返回 false
。
时间复杂度 $O(1)$,空间复杂度 $O(1)$。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|