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

文章目录

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阿明),一起加油、一起学习进步!
Michael阿明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Michael阿明

如果可以,请点赞留言支持我哦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值