LeetCode 1670. 设计前中后队列(deque)

文章目录

    • 1. 题目
    • 2. 解题

1. 题目

请你设计一个队列,支持在前,中,后三个位置的 push 和 pop 操作。

请你完成 FrontMiddleBack 类:

FrontMiddleBack() 初始化队列。
void pushFront(int val) 将 val 添加到队列的 最前面
void pushMiddle(int val) 将 val 添加到队列的 正中间
void pushBack(int val) 将 val 添加到队里的 最后面
int popFront() 将 最前面 的元素从队列中删除并返回值,如果删除之前队列为空,那么返回 -1 。
int popMiddle() 将 正中间 的元素从队列中删除并返回值,如果删除之前队列为空,那么返回 -1 。
int popBack() 将 最后面 的元素从队列中删除并返回值,如果删除之前队列为空,那么返回 -1 。

请注意当有 两个 中间位置的时候,选择靠前面的位置进行操作。比方说:

将 6 添加到 [1, 2, 3, 4, 5] 的中间位置,结果数组为 [1, 2, 6, 3, 4, 5] 。
从 [1, 2, 3, 4, 5, 6] 的中间位置弹出元素,返回 3 ,数组变为 [1, 2, 4, 5, 6] 。

示例 1:
输入:
["FrontMiddleBackQueue", "pushFront", "pushBack", "pushMiddle", 
"pushMiddle", "popFront", "popMiddle", "popMiddle", "popBack", "popFront"]
[[], [1], [2], [3], [4], [], [], [], [], []]
输出:
[null, null, null, null, null, 1, 3, 4, 2, -1]解释:
FrontMiddleBackQueue q = new FrontMiddleBackQueue();
q.pushFront(1);   // [1]
q.pushBack(2);    // [1, 2]
q.pushMiddle(3);  // [1, 3, 2]
q.pushMiddle(4);  // [1, 4, 3, 2]
q.popFront();     // 返回 1 -> [4, 3, 2]
q.popMiddle();    // 返回 3 -> [4, 2]
q.popMiddle();    // 返回 4 -> [2]
q.popBack();      // 返回 2 -> []
q.popFront();     // 返回 -1 -> [] (队列为空)提示:
1 <= val <= 10^9
最多调用 1000 次 pushFront, pushMiddle, pushBack, popFront, popMiddle 和 popBack 。

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

2. 解题

  • 使用1个双端队列,插入 Mid 的时间复杂度为O(n)
class FrontMiddleBackQueue {deque<int> q;int n = 0;
public:FrontMiddleBackQueue() {}void pushFront(int val) {q.push_front(val);n++;}void pushMiddle(int val) {int mid = (n)/2;q.insert(q.begin()+mid, val);n++;}void pushBack(int val) {q.push_back(val);n++;}int popFront() {if(q.empty())return -1;int ans = q.front();q.pop_front();n--;return ans;}int popMiddle() {if(q.empty())return -1;int mid = (n-1)/2;int ans = q[mid];q.erase(q.begin()+mid);n--;return ans;}int popBack() {if(q.empty())return -1;int ans = q.back();q.pop_back();n--;return ans;}
};

96 ms 20.2 MB C++

  • 使用 2 个双端队列,永远使得 q1.size = q2.size or q1.size = q2.size + 1,这样可以在 q1 的队尾取得 Mid,时间复杂度O(1)
class FrontMiddleBackQueue {deque<int> q1, q2;int v, ans;
public:FrontMiddleBackQueue() {}bool sameLen(){return q1.size() == q2.size();}void pushFront(int val) {if(q1.empty()){q1.push_front(val);return;}if(sameLen())q1.push_front(val);else{q1.push_front(val);v = q1.back();q1.pop_back();q2.push_front(v);}}void pushMiddle(int val) {if(q1.empty()){q1.push_front(val);return;}if(sameLen()){q1.push_back(val);}else{v = q1.back();q1.pop_back();q2.push_front(v);q1.push_back(val);}}void pushBack(int val) {if(q1.empty()){q1.push_front(val);return;}if(sameLen()){q2.push_back(val);v = q2.front();q2.pop_front();q1.push_back(v);}else{q2.push_back(val);}}int popFront() {if(q1.empty())return -1;if(sameLen()){ans = q1.front();q1.pop_front();v = q2.front();q2.pop_front();q1.push_back(v);}else{ans = q1.front();q1.pop_front();}return ans;}int popMiddle() {if(q1.empty())return -1;ans = q1.back();q1.pop_back();if(!sameLen() && !q2.empty()){v = q2.front();q2.pop_front();q1.push_back(v);}return ans;}int popBack() {if(q1.empty())return -1;if(sameLen()){ans = q2.back();q2.pop_back();}else{if(!q2.empty()){ans = q2.back();q2.pop_back();v = q1.back();q1.pop_back();q2.push_front(v);}else{ans = q1.back();q1.pop_back();}}return ans;}
};

60 ms 20.7 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473471.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 1.7 新特性

1.对Java集合&#xff08;Collections&#xff09;的增强支持 在JDK1.7之前的版本中&#xff0c;Java集合容器中存取元素的形式如下&#xff1a; 以List、Set、Map集合容器为例&#xff1a; 在JDK1.7中&#xff0c;摒弃了Java集合接口的实现类&#xff0c;如&#xff1a;ArrayL…

机器学习回归算法—岭回归及案例分析

一、回归算法之岭回归具有L2正则化的线性最小二乘法。岭回归是一种专用于共线性数据分析的有偏估计回归方法&#xff0c;实质上是一种改良的最小二乘估计法&#xff0c;通过放弃最小二乘法的无偏性&#xff0c;以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠…

LeetCode 1671. 得到山形数组的最少删除次数(最长上升子序DP nlogn)

文章目录1. 题目2. 解题2.1 n^2 解法2.2 nlogn 解法197 / 1891&#xff0c;前10.4%435 / 6154&#xff0c;前7.07%前三题如下&#xff1a; LeetCode 5557. 最大重复子字符串 LeetCode 5558. 合并两个链表 LeetCode 5560. 设计前中后队列&#xff08;deque&#xff09; 1. 题目…

【leetcode刷题笔记】Single Number

题目&#xff1a; Given an array of integers, every element appears twice except for one. Find that single one. Note:Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? 看了别人的解答才会的&#xff0c;…

机器学习非监督学习—k-means及案例分析

一、非监督学习无监督学习&#xff0c;顾名思义&#xff0c;就是不受监督的学习&#xff0c;一种自由的学习方式。该学习方式不需要先验知识进行指导&#xff0c;而是不断地自我认知&#xff0c;自我巩固&#xff0c;最后进行自我归纳&#xff0c;在机器学习中&#xff0c;无监…

机器学习Tensorflow基础知识、张量与变量

TensorFlow是一个采用数据流图&#xff08;data flow graphs&#xff09;&#xff0c;用于数值计算的开源软件库。节点&#xff08;Nodes&#xff09;在图中表示数学操作&#xff0c;图中的线&#xff08;edges&#xff09;则表示在节点间相互联系的多维数据数组&#xff0c;即…

Entityframework批量删除

UI层 1 <a href"#" οnclick"DelData(0);return false;" id"a_del" class"easyui-linkbutton" iconcls"icon-cancel">删除</a> UI中js&#xff1a; 1 //删除按钮事件2 function DelData(id) {3 …

LeetCode 1672. 最富有客户的资产总量

文章目录1. 题目2. 解题1. 题目 给你一个 m x n 的整数网格 accounts &#xff0c;其中 accounts[i][j] 是第 i​​​​​​​​​​​​ 位客户在第 j 家银行托管的资产数量。 返回最富有客户所拥有的 资产总量 。 客户的 资产总量 就是他们在各家银行托管的资产数量之和。最…

机器学习Tensorflow基本操作:线程队列图像

一、线程和队列在使用TensorFlow进行异步计算时&#xff0c;队列是一种强大的机制。为了感受一下队列&#xff0c;让我们来看一个简单的例子。我们先创建一个“先入先出”的队列&#xff08;FIFOQueue&#xff09;&#xff0c;并将其内部所有元素初始化为零。然后&#xff0c;我…

关于使用ModelSim中编写testbench模板问题

对于初学者来说写Testbench测试文件还是比较困难的&#xff0c;但Modelsim和quartus ii都提供了模板&#xff0c;下面就如何使用Modelsim提供的模板进行操作。 Modelsim提供了很多Testbench模板&#xff0c;我们直接拿过来用可以减少工作量。对源文件编译完后&#xff0c;鼠标光…

LeetCode 1673. 找出最具竞争力的子序列(单调栈)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums 和一个正整数 k &#xff0c;返回长度为 k 且最具 竞争力 的 nums 子序列。 数组的子序列是从数组中删除一些元素&#xff08;可能不删除元素&#xff09;得到的序列。 在子序列 a 和子序列 b 第一个不相同的位置上&am…

Flask基础知识总结

有一些东西是大多数网络应用都会用到的。比如许多应用都会使用关系型数据库和用户 验证&#xff0c;在请求之前连接数据库并得到当前登录用户的信息&#xff0c;在请求之后关闭数据库连接。 更多用户贡献的代码片断和方案参见 current_app 主要内容&#xff1a; 大型应用应用工…

android获取string.xml的值

为什么需要把应用中出现的文字单独存放在string.xml文件中呢&#xff1f; 一&#xff1a;是为了国际化&#xff0c;当需要国际化时&#xff0c;只需要再提供一个string.xml文件,把里面的汉子信息都修改为对应的语言&#xff08;如&#xff0c;English&#xff09;&#xff0c;再…

牛客 怕npy的牛牛(双指针)

文章目录1. 题目2. 解题1. 题目 链接&#xff1a;https://ac.nowcoder.com/acm/contest/9556/B 来源&#xff1a;牛客网 题目描述 牛牛非常怕他的女朋友&#xff0c;怕到了走火入魔的程度&#xff0c;以至于每当他看到一个字符串同时含有n,p,y三个字母他都害怕的不行。 现在…

Flask入门之上传文件到本地服务器

Flask入门之上传文件到服务器今天要做一个简单的页面&#xff0c;可以实现将文件 上传到服务器&#xff08;保存在指定文件夹&#xff09;#Sample.py1 # coding:utf-82 3 from flask import Flask,render_template,request,redirect,url_for4 from werkzeug.utils import secur…

对象的三种状态

来自为知笔记(Wiz)转载于:https://www.cnblogs.com/zmpandzmp/p/3649196.html

Cygwin中如何像在Ubuntu中一样安装软件

cygwin作为windows下模拟Linux环境的的工具&#xff0c;使得我们能在windows下非常方便的使用Linux的命令和工具&#xff0c;下面讲讲怎样在cygwin添加不支持的命令。 1.首先安装cygwin&#xff1a;我们可以到Cygwin的官方网站下载Cygwin的安装程序&#xff0c;地址是&#xff…

大数据量

1.数据层放弃SQL Server数据库和存储过程&#xff0c;全部迁移到Linux平台上的MySQL数据库上&#xff1b;2.缓存不再依赖.net自身提供的缓存机制&#xff0c;迁移到部署在Linux平台上的分布式的Redis上&#xff1b;3.服务之间的调用&#xff0c;避免使用.net自身专有协议&#…

LeetCode 321. 拼接最大数(单调栈)*

文章目录1. 题目2. 解题1. 题目 给定长度分别为 m 和 n 的两个数组&#xff0c;其元素由 0-9 构成&#xff0c;表示两个自然数各位上的数字。 现在从这两个数组中选出 k (k < m n) 个数字拼接成一个新的数&#xff0c;要求从同一个数组中取出的数字保持其在原数组中的相对…

pandas数据分析选则接近数值的最接优方案

import numpy as np import pandas as pd# pandas数据分析选则接近数值的最接优方案# 1.准备数据 CHILD_TABLE (720, 750) CHIDL_STOOL (300, 350) CHILD_PLAY_LEN (300, 400) CHILD_TENT (1100, 1300) # 2.遍历循环&#xff0c;添加到列表中 sum_length_lst [] play_lst …