算法通关村第5关【白银】| 哈希和栈经典算法题

1.两个栈实现队列 

思路:两个栈,一个输入栈,一个输出栈。

当需要输入的时候就往inStack中插入,需要输出就往outStack中输出,当输出栈是空就倒出输入栈的数据到输出栈中,这样就保证了后插入的数据从栈顶倒入了栈底,输出栈栈顶弹出的一定是原先输入栈栈底的数据,也就是先进来的,即先进先出。 

class MyQueue {Deque<Integer> inStack ;Deque<Integer> outStack;public MyQueue() {inStack = new LinkedList<>();outStack = new LinkedList<>();}public void push(int x) {inStack.push(x);}public int pop() {if(outStack.isEmpty()){while(!inStack.isEmpty()){outStack.push(inStack.pop());}return outStack.pop();}else{return outStack.pop();}}public int peek() {if(outStack.isEmpty()){while(!inStack.isEmpty()){outStack.push(inStack.pop());}return outStack.peek();}else{return outStack.peek();}}public boolean empty() {return inStack.isEmpty() && outStack.isEmpty();}
}

2.两个队列实现栈

思路:确保队列前端是后进数据,用两个队列实现后插入数据在前面效果

(从下方叠罗汉,每次插入,先放好一层,然后将原先所有数据抬起然后放到新的一层上面,这样达到后加入数据始终在前面)。

queue2必定为空,数据压入queue2,这样就确保队列前端是后进的数据

然后将queue1的数据灌入queue2,交换queue1和queue2,queue2仍然为空

需要弹出的时候就弹出queue1的数据就行,因为queue1始终保持后进数据在队列前端。

class MyStack {Deque<Integer> q1;Deque<Integer> q2;public MyStack() {q1 = new LinkedList<>();q2 = new LinkedList<>();}public void push(int x) {q2.offer(x);while(!q1.isEmpty()){q2.offer(q1.remove());}Deque<Integer> t = q1;q1 = q2;q2 = t;}public int pop() {return q1.remove();}public int top() {return q1.peek();}public boolean empty() {return q1.isEmpty();}
}

3.n数之和

两数之和

思路:

一、暴力两层循环 ,不可取

二、使用哈希表。每遍历过一个元素就记录下来,判断有没有包含target-nums[i]的值

class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer,Integer> map = new HashMap<>();for(int i = 0;i<nums.length;i++){int tar = target - nums[i];if(map.containsKey(tar)){return new int[]{i,map.get(tar)};}else{map.put(nums[i],i);}}return null;}
}

三数之和

思路:

一、双层循环+两数之和。

排序之后,先确定nums[i]为三数之一,然后从剩下的数中找到两数之和为-nums[i]的数,三数之和就是0.

class Solution {public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();if (nums == null || nums.length < 3) {return result;}Arrays.sort(nums);for (int i = 0; i < nums.length - 2; i++) {if (i > 0 && nums[i] == nums[i - 1]) {continue; // Skip duplicates}int target = -nums[i];Map<Integer, Integer> map = new HashMap<>();for (int j = i + 1; j < nums.length; j++) {int complement = target - nums[j];if (map.containsKey(complement)) {result.add(Arrays.asList(nums[i], complement, nums[j]));while (j + 1 < nums.length && nums[j] == nums[j + 1]) {j++; // Skip duplicates}}map.put(nums[j], j);}}return result;}
}

二、排序+双指针

先从小到大排序,两层循环

外层循环用来确定一个三数之一,然后内层循环双指针确定另外两数

之和大于目标right--

之和小于目标left++

之和等于目标加入答案,同时为了避免重复答案,需要跳过相同的数字

外层循环需要跳过相同的数字避免重复答案,同时必须是nums[i]==nums[i-1]

例如:[-1,-1,0,1,2]

[-1,0,1],[-1,-1,2]都是答案,不能跳过第一个-1

if(i>0&&nums[i] == nums[i-1]){continue;}
class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result = new ArrayList<>();if (nums == null || nums.length < 3) {return result;}Arrays.sort(nums);int i,l,r;for(i=0;i<nums.length;i++){if(nums[i]>0) break;if(i>0&&nums[i]==nums[i-1]){continue;}int tar = -nums[i];for(l = i+1,r = nums.length -1;l<r;){if(nums[l]+nums[r]>tar){r--;}else if(nums[l]+nums[r]<tar){l++;}else{List<Integer> list = new ArrayList<>();list.add(nums[i]);list.add(nums[l]);list.add(nums[r]);result.add(list);while (r > l && nums[r] == nums[r - 1]) r--;while (r > l && nums[l] == nums[l + 1]) l++;l++;r--;}}}return result;}
}

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

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

相关文章

快速上手: Linux环境配置, 基本指令与项目部署要点

文章目录 1. Linux前置知识1.1. 什么是Linux1.2. Linux环境的搭建 2. Linux常用命令lscd pwdtouch cat more echo mkdirvi/vimrm cp mvgrep ps netstat 管道符yum相关Linux权限 3. 使用Linux部署Servlet项目3.1. 安装JDK3.2. 安装Tomcat3.3. 通过yum安装MariaDB3.4. 部署Servle…

陪诊小程序|陪诊软件开发功能|陪诊平台优势

随着人们生活水平的提高&#xff0c;对健康的关注度也在不断增加。尤其是在疫情过后&#xff0c;人们对自己和家人的健康问题更加重视。因此陪诊系统应运而生&#xff0c;为用户提供便捷、高效的陪诊陪护和跑腿服务。那么陪诊系统包含哪些功能呢&#xff1f; 首先&#xff0c;陪…

uni.uploadFile上传 PHP接收不到

开始这样&#xff0c;后端$file $request->file(file);接收不到 数据跑到param中去了 去掉Content-Type&#xff0c;就能接收到了 param只剩下

(视频教程)单细胞转录组多组差异基因分析及可视化函数

很久以前&#xff0c;我们发布过一个单细胞多组差异基因可视化的方法。跟着Cell学单细胞转录组分析(八):单细胞转录组差异基因分析及多组结果可视化。主要复现参考的是这篇发表在《Cell》上的文章。可以将多个组的差异结果展示出来。 &#xff08;reference&#xff1a;A Spati…

归并排序之从微观看递归

前言 这次&#xff0c;并不是具体讨论归并排序算法&#xff0c;而是利用归并排序算法&#xff0c;探讨一下递归。归并排序的特点在于连续使用了两次递归调用&#xff0c;这次我们将从微观上观察递归全过程&#xff0c;从本质上理解递归&#xff0c;如果能看完&#xff0c;你一…

初识linux系统(一)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、linux 发展史 二、Linux操作系统的特点 三、Linux操作系统内核版本 四、常见发行版本 五、 常见开源软件 六、 常见应用场景 七、系统安装 总结 前言 …

因果推断(六)基于微软框架dowhy的因果推断

因果推断&#xff08;六&#xff09;基于微软框架dowhy的因果推断 DoWhy 基于因果推断的两大框架构建&#xff1a;「图模型」与「潜在结果模型」。具体来说&#xff0c;其使用基于图的准则与 do-积分来对假设进行建模并识别出非参数化的因果效应&#xff1b;而在估计阶段则主要…

最新Nmap入门技术

点击星标&#xff0c;即时接收最新推文 本文选自《web安全攻防渗透测试实战指南&#xff08;第2版&#xff09;》 点击图片五折购书 Nmap详解 Nmap&#xff08;Network Mapper&#xff0c;网络映射器&#xff09;是一款开放源代码的网络探测和安全审核工具。它被设计用来快速扫…

博客写长篇,公众号写短篇

博客使用的markdown格式非常适合技术类的文章&#xff0c;我大部分博客的内容写的都很长&#xff0c;有一部分很深的内容&#xff0c;也有特别基础的内容。 因为之前写博客总会花费太多时间&#xff0c;所以量比较少&#xff0c;现在打算用更少的时间在公众号写一些简单的内容…

Ubuntu Touch OTA-2 推出,支持 Fairphone 3 和 F(x)tec Pro1 X

导读UBports 基金会近日宣布为基于 Ubuntu 20.04 LTS (Focal Fossa) 的 Ubuntu Touch 移动操作系统发布并全面提供 OTA-2 软件更新。 Ubuntu Touch OTA-2 在首次 OTA 更新整整四个月后发布&#xff0c;支持新设备&#xff0c;包括 Fairphone 3、F(x)tec Pro1 X 和 Vollaphone X…

抖音seo短视频矩阵系统源码开发源代码分享--开源-可二开

适用于抖音短视频seo矩阵系统&#xff0c;抖音矩阵系统源码&#xff0c;短视频seo矩阵系统源码&#xff0c;短视频矩阵源码开发&#xff0c;支持二次开发&#xff0c;开源定制&#xff0c;招商加盟SaaS研发等。 功能开发设计 1. AI视频批量剪辑&#xff08;文字转语音&#x…

Dolphin for Mac(Wii游戏模拟器)配置指南

Wii模拟器Dolphin Mac是款适合Mac电脑中的游戏玩家们使用的模拟器工具。Wii模拟器Dolphin Mac官方版支持直接运行游戏镜像文件&#xff0c;玩家可以将游戏ISO拷贝到某一个文件夹中统一进行管理。Wii模拟器Dolphin Mac除了键盘和鼠标外&#xff0c;还支持配合原版的Wii遥控器操作…