当前位置:网站首页>leetcode:281. 锯齿迭代器
leetcode:281. 锯齿迭代器
2022-08-10 16:39:00 【OceanStar的学习笔记】
题目来源
题目描述

class ZigzagIterator {
public:
ZigzagIterator(vector<int>& v1, vector<int>& v2){
}
bool hasNext(){
}
int next(){
}
};
题目解析
思路(仅适用于k = 2时)
- 用两个变量i和j分别记录两个向量的当前元素,初始化为0
- next:
- 当i < j时,说明需要打印v1的元素,否则打印v2的元素
- hasNext:
- 当 i = = v 1. s i z e i==v1.size i==v1.size&& j = = v 2. s i z e j==v2.size j==v2.size,那么返回false
- 当 i = = v 1. s i z e ∣ ∣ j = = v 2. s i z e i == v1.size || j == v2.size i==v1.size∣∣j==v2.size,那么将对应的i或者j赋值为INT_MAX,这样不影响打印另一个值
class ZigzagIterator {
std::vector<std::vector<int>> v;
int i, j;
public:
ZigzagIterator(vector<int>& v1, vector<int>& v2){
v.push_back(v1);
v.push_back(v2);
i = j = 0;
}
bool hasNext(){
if(i >= v[0].size()){
i = INT32_MAX;
}
if(j >= v[1].size()){
j = INT32_MAX;
}
return i < v[0].size() || j < v[1].size();
}
int next(){
return i <= j ? v[0][i++] : v[1][j++];
}
};
思路二
- 直接在初始化的时候就两个数组按照之字形的顺序存入另一个一维数组中
- 接下来就维护一个变量i,并按照顺序打印新数组中的值即可
class ZigzagIterator {
public:
ZigzagIterator(vector<int>& v1, vector<int>& v2){
int n1 = v1.size(), n2 = v2.size(), n = std::max(n1, n2);
for (int i = 0; i < n; ++i) {
if(i < n1){
v.push_back(v1[i]);
}
if(i < n2){
v.push_back(v2[i]);
}
}
}
bool hasNext(){
return idx < v.size();
}
int next(){
return v[idx++];
}
private:
vector<int> v;
int idx = 0;
};
但是如果v比较大,那么空间复杂度会很高。看下面方法
follow
queue + iterator:
- 用一个queue保存iterator的pair, 初始化的时候,有几个数组就生成几个pair放到queue里面,每个pair保存该数组的首位置和尾位置的iterator
- next的时候:
- 取出queue队首的一个pair
- 如果当前的iterator不等于end,将其下一个位置的iterator和end存入队尾,然后返回当前位置的是
- haxNext:
- queue是否为空
class ZigzagIterator {
std::queue<std::pair<std::vector<int>::iterator, std::vector<int>::iterator>> q;
public:
ZigzagIterator(vector<int>& v1, vector<int>& v2){
if(!v1.empty()){
q.push(make_pair(v1.begin(), v1.end()));
}
if(!v2.empty()){
q.push(make_pair(v2.begin(), v2.end()));
}
}
bool hasNext(){
return !q.empty();
}
int next(){
auto it = q.front().first, end = q.front().second; q.pop();
if(it + 1 != end){
q.push(make_pair(it + 1, end));
}
return *it;
}
private:
};
类似题目
边栏推荐
猜你喜欢

leetcode:1013. 将数组分成和相等的三个部分

剑指OfferⅡ 045.二叉树最底层最左边的值 dfs

开源生态与AI芯片的碰撞&Dragonfly基于P2P的镜像加速系统 | 第 39-40 期

数学基础(五)最优化理论(最优化,无约束,有约束,拉格朗日乘子的意义,KKT条件)

电力系统潮流【牛顿-拉夫逊法】(4节点、5节点、6节点、9节点)(Matlab代码实现)

2022 CCF China Open Source Conference Notice (Fourth Round)

重庆新壹汽与一汽集团达成新能源项目战略合作,赋能“碳中和”创造“碳财富”

C语言各种符号如何使用

HTTP学习——协议与术语、HTTP、缓存、Cookie

The sword refers to OfferⅡ 045. The bottommost leftmost value of the binary tree dfs
随机推荐
C专家编程 第10章 再论指针 10.4 向函数传递一个一维数组
Polling and the principle of webSocket and socket.io
一张图快速了解 Istio 的 EnvoyFilter
Alluxio on Amazon EMR 集成实践
Mastodon:可创建类似推特的开源社交网络服务器
如何将jpg图片变成gif?教你一分钟图片合成gif的方法
v-for指令:根据数据生成列表结构
【硬件架构的艺术】学习笔记(4)流水线的艺术
常用持续集成工具对比
奥迪的极致高端属于一个大写的H?重塑时空,谁会是这个夜晚的主角?
WIZnet 物联网设计大赛 - WizFi360大赛延迟通知
FTXUI基础笔记(botton按钮组件进阶)
x64汇编代码测试 用户模式和内核模式
神经网络的图像识别技术,神经网络识别图像原理
mysql包select结果无法同步的问题
电力系统潮流【牛顿-拉夫逊法】(4节点、5节点、6节点、9节点)(Matlab代码实现)
直播预告|从新手村到魔王城,高效默契的敏捷团队如何炼成
如何修改gif图片尺寸?教你一键裁剪gif尺寸
神经网络如何提高准确率,神经网络的求解方式
如何使用Swift Package插件生成代码