LeetCode 281. 锯齿迭代器(map+vector)

    技术2024-07-25  19

    文章目录

    1. 题目2. 解题

    1. 题目

    给出两个一维的向量,请你实现一个迭代器,交替返回它们中间的元素。

    示例: 输入: v1 = [1,2] v2 = [3,4,5,6] 输出: [1,3,2,4,5,6] 解析: 通过连续调用 next 函数直到 hasNext 函数返回 false, next 函数返回值的次序应依次为: [1,3,2,4,5,6]。 拓展:假如给你 k 个一维向量呢?你的代码在这种情况下的扩展性又会如何呢? 拓展声明: “锯齿” 顺序对于 k > 2 的情况定义可能会有些歧义。 所以,假如你觉得 “锯齿” 这个表述不妥,也可以认为这是一种 “循环”。 例如: 输入: [1,2,3] [4,5,6,7] [8,9] 输出: [1,4,8,2,5,9,3,6,7].

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/zigzag-iterator 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    2. 解题

    class ZigzagIterator { map<int, vector<int>> m; unordered_map<int,int> idx; int total = 0; map<int, vector<int>>::iterator it; public: ZigzagIterator(vector<int>& v1, vector<int>& v2) { m[0] = v1; m[1] = v2; it = m.begin(); idx[0] = 0; idx[1] = 0; total += v1.size()+v2.size(); } int next() { if(!hasNext()) return -1; if(it == m.end()) it = m.begin();//循环 if(idx[it->first] == it->second.size()) { //该数组指针到结尾了 m.erase(it++);//删除该数组,移动到下一个数组 return next(); } int val = it->second[idx[it->first]];//答案值 idx[it->first]++;//数组遍历位置+1 it++;//去下一个数组 total--;//总数-1 return val; } bool hasNext() { return total; } };

    12 ms 8.6 MB


    长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

    Processed: 0.026, SQL: 9