[Leedcode][JAVA][第155题][最小栈][基本类型包装类]

【问题描述】

【解答思路】

1. 两个栈实现

1.1、辅助栈和数据栈同步

特点:编码简单,不用考虑一些边界情况,就有一点不好:辅助栈可能会存一些“不必要”的元素。

1.2、辅助栈和数据栈不同步

特点:由“辅助栈和数据栈同步”的思想,我们知道,当数据栈进来的数越来越大的时候,我们要在辅助栈顶放置和当前辅助栈顶一样的元素,这样做有点“浪费”。基于这一点,我们做一些“优化”,但是在编码上就要注意一些边界条件。

(1)辅助栈为空的时候,必须放入新进来的数;

(2)新来的数小于或者等于辅助栈栈顶元素的时候,才放入,特别注意这里“等于”要考虑进去,因为出栈的时候,连续的、相等的并且是最小值的元素要同步出栈;

(3)出栈的时候,辅助栈的栈顶元素等于数据栈的栈顶元素,才出栈。

总结一下:出栈时,最小值出栈才同步;入栈时,最小值入栈才同步。

1.1、辅助栈和数据栈同步

import java.util.Stack;public class MinStack {// 数据栈private Stack<Integer> data;// 辅助栈private Stack<Integer> helper;/*** initialize your data structure here.*/public MinStack() {data = new Stack<>();helper = new Stack<>();}// 思路 1:数据栈和辅助栈在任何时候都同步public void push(int x) {// 数据栈和辅助栈一定会增加元素data.add(x);if (helper.isEmpty() || helper.peek() >= x) {helper.add(x);} else {helper.add(helper.peek());}}public void pop() {// 两个栈都得 popif (!data.isEmpty()) {helper.pop();data.pop();}}public int top() {if(!data.isEmpty()){return data.peek();}throw new RuntimeException("栈中元素为空,此操作非法");}public int getMin() {if(!helper.isEmpty()){return helper.peek();}throw new RuntimeException("栈中元素为空,此操作非法");}
}

1.2、辅助栈和数据栈不同步

import java.util.Stack;public class MinStack {// 数据栈private Stack<Integer> data;// 辅助栈private Stack<Integer> helper;/*** initialize your data structure here.*/public MinStack() {data = new Stack<>();helper = new Stack<>();}// 思路 2:辅助栈和数据栈不同步// 关键 1:辅助栈的元素空的时候,必须放入新进来的数// 关键 2:新来的数小于或者等于辅助栈栈顶元素的时候,才放入(特别注意这里等于要考虑进去)// 关键 3:出栈的时候,辅助栈的栈顶元素等于数据栈的栈顶元素,才出栈,即"出栈保持同步"就可以了public void push(int x) {// 辅助栈在必要的时候才增加data.add(x);// 关键 1 和 关键 2if (helper.isEmpty() || helper.peek() >= x) {helper.add(x);}}public void pop() {// 关键 3:data 一定得 pop()if (!data.isEmpty()) {// 注意:声明成 int 类型,这里完成了自动拆箱,从 Integer 转成了 int,因此下面的比较可以使用 "==" 运算符// 参考资料:https://www.cnblogs.com/GuoYaxiang/p/6931264.html// 如果把 top 变量声明成 Integer 类型,下面的比较就得使用 equals 方法int top = data.pop();if(top == helper.peek()){helper.pop();}}}public int top() {if(!data.isEmpty()){return data.peek();}throw new RuntimeException("栈中元素为空,此操作非法");}public int getMin() {if(!helper.isEmpty()){return helper.peek();}throw new RuntimeException("栈中元素为空,此操作非法");}}
2. 一个栈+辅助

当有更小的值来的时候,要把之前的最小值入栈,当前更小的值再入栈即可。当这个最小值要出栈的时候,下一个值便是之前的最小值了。

入栈 2 ,同时将之前的 min 值 3 入栈,再把 2 入栈,同时更新 min = 2
| 2 |   min = 2
| 3 |  
| 5 |     
|_3_|    
stack  入栈 6 
| 6 |  min = 2
| 2 |   
| 3 |  
| 5 |     
|_3_|    
stack  出栈 6     
| 2 |   min = 2
| 3 |  
| 5 |     
|_3_|    
stack  出栈 2     
| 2 |   min = 2
| 3 |  
| 5 |     
|_3_|    
stack  
class MinStack {int min = Integer.MAX_VALUE;Stack<Integer> stack = new Stack<Integer>();public void push(int x) {//当前值更小if(x <= min){   //将之前的最小值保存stack.push(min);//更新最小值min=x;}stack.push(x);}public void pop() {//如果弹出的值是最小值,那么将下一个元素更新为最小值if(stack.pop() == min) {min=stack.pop();}}public int top() {return stack.peek();}public int getMin() {return min;}
}
3. 链表同步法
  • 链表头插法实现基本功能
  • 最小值实现在 Node 节点中增加一个 min 字段,每次加入一个节点的时候,只要确定它的 min 值即可。
class MinStack {class Node{int value;int min;Node next;Node(int x, int min){this.value=x;this.min=min;next = null;}}Node head;//每次加入的节点放到头部public void push(int x) {if(null==head){head = new Node(x,x);}else{//当前值和之前头结点的最小值较小的做为当前的 minNode n = new Node(x, Math.min(x,head.min));n.next=head;head=n;}}public void pop() {if(head!=null)head =head.next;}public int top() {if(head!=null)return head.value;return -1;}public int getMin() {if(null!=head)return head.min;return -1;}
}

【总结】

1.思路总结 最小栈 两个栈/一个栈+一个额外存储 / 链表实现
2. 包装类的用法

这里只讨论六种数字基本类型对应的包装类,因为它们是使用最频繁的,这些类中常用的方法可分为两类:一种是本类型与其它基本类型之间的转换,另一种是字符串与本类型和基本类型之间的转换。如下图,是Integer类中的一些常用方法:

在这里插入图片描述

其中的前五个,都是属于第一种,即与其它基本类型之间的转换。下面的三个则属于第二种,是字符串与本类型及基本类型之间的转换。

A、本类型与其它类型转换

示例如下:

 Integer temp1 = new Integer(45);int temp2 = 45;byte t1 =  temp1.byteValue();  //包装类的转换byte t2 = (byte)temp2;  //基本数据类型的强制类型转换

B、本类型和对应基本类型转换

JDK1.5引入了自动装箱和拆箱的机制,那么什么是装箱和拆箱呢?

装箱就是将基本类型转换成包装类,分为自动装箱和手动装箱。同样地,拆箱就是将包装类型转换成基本类型,也分为自动拆箱和手动拆箱。

示例如下:

int a1=4;//手动装箱
Integer aI1 = new Integer(a1);
//自动装箱
Integer aI2 = a1;//手动拆箱
int ai1 = aI1.intValue();
//自动拆箱
int ai2 = aI2;

C、字符串和基本类型转换

c1.基本类型转换成字符串类型

c1a. 包装类 的toString()方法

c1b. String 类的valueOf()方法

c1c. 空字符串加一个基本类型变量

//基本类型转换成字符串类型有三种方法int b = 1;String b1 = Integer.toString(b);String b2 = String.valueOf(b);
String b3 = b+"";
System.out.println("b1:  "+b1+"b2: "+b2+"b3: "+b3);

c2.字符串转换成基本类型

c2a. 包装类的parse***()静态方法

c2b. 包装类的valueOf()方法

//字符串转换成基本类型的方法有两种
String b = “121”;
int c1 = Integer.parseInt(b);
int c2 = Integer.valueOf(b);

3. java基本类型 & 包装类 & 异同

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.Integer与int数据的比较

在这里插入图片描述

public class TestInteger {public static void main(String[] args) {int t1 = 46;int t2 = 46;Integer t3 = 46;Integer t4 = new Integer(46);Integer t5 = t1;Integer t6 = new Integer(t2);System.out.println("t1 == t2  " + (t1 == t2));System.out.println("t1 == t3  " + (t1 == t3));System.out.println("t1 == t4  " + (t1 == t4));System.out.println("t1 == t5  " + (t1 == t5));System.out.println("t1 == t6  " + (t1 == t6));System.out.println("t4 == t2  " + (t4 == t2));System.out.println("t5 == t2  " + (t5 == t2));System.out.println("t6 == t2  " + (t6 == t2));System.out.println("t4 == t3  " + (t4 == t3));System.out.println("t5 == t3  " + (t5 == t3));System.out.println("t6 == t3  " + (t6 == t3));System.out.println("t3 equals t4  " + (t3.equals(t4)));System.out.println("t3 equals t5  " + (t3.equals(t5)));System.out.println("t3 equals t6  " + (t3.equals(t6)));System.out.println("t3 equals t4  " + (t3.equals(t4)));System.out.println("t4 equals t5  " + (t4.equals(t5)));System.out.println("t4 equals t6  " + (t4.equals(t6)));System.out.println("t5 equals t6  " + (t5.equals(t6)));        }
}

在这里插入图片描述

转载链接:https://leetcode-cn.com/problems/min-stack/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-38/
转载链接:https://leetcode-cn.com/problems/min-stack/solution/shi-yong-fu-zhu-zhan-tong-bu-he-bu-tong-bu-python-/
参考链接:https://www.cnblogs.com/GuoYaxiang/p/6931264.html

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

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

相关文章

淘宝主站Cgroup资源控制

目录 项目背景&#xff1a;主站的现状 选型的过程 Cgroup/LinuxContainer介绍 定制和开发 存在的问题和对策 项目背景 主站&#xff1a; 跑在xen虚拟机上的Java应用 处理业务逻辑&#xff0c;本地无重要存储&#xff0c;无状态。 一台物理机部署3台虚拟机 双路Xeon&#…

qq邮箱html个签模板,qq邮箱个性签名模板

qq邮箱个性签名模板http://www.qqzf.cn/lizhi68465/1、踮起脚尖&#xff0c;我们就能离幸福更近一点吗&#xff1f;2、不是放不下&#xff0c;只是心里觉得遗憾&#xff0c;曾经付出了那么多的感情&#xff0c;到最后说没就没了。3、见不到你的時候&#xff0c;心里有好多话想和…

ApacheCN 数据科学/人工智能/机器学习知识树 2019.2

【主页】 apachecn.org【Github】ApacheCN暂时下线: 社区暂时下线: cwiki 知识库自媒体平台 微博&#xff1a;ApacheCN知乎&#xff1a;ApacheCNCSDN简书OSChina博客园我们不是 Apache 的官方组织/机构/团体&#xff0c;只是 Apache 技术栈&#xff08;以及 AI&#xff09;的爱…

[Leedcode][JAVA][第102题][二叉树的层序遍历][递归][迭代][BFS]

【问题描述】[第102题][二叉树的层序遍历][中等] 给你一个二叉树&#xff0c;请你返回其按 层序遍历 得到的节点值。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。示例&#xff1a; 二叉树&#xff1a;[3,9,20,null,null,15,7],3/ \9 20/ \15 7 返…

java学习(178):终篇?静态代理?动态代理?

总体设计 包com.xzit.aop DynlnvokeProducerProxy 包com.xzit.db db 包com.xzit.entity ClientDepartmentEmployeeGoodsProducer 包com.xzit.interfaces DepartmentDaoImpEmployeeDaoImpIGoodsIObject 包com.xzit.proxy TeatDynProxyTestStaticProxy 咱直接上代码&#xff0c;…

经济学与计算机学收入,考研心得,计算机专业跨考经济学复习经验谈

中国中国人民大学的经济学科以其治学严谨而久负盛名。自2006年至今&#xff0c;经济学科的研究生入学考试初试命题由经济学院命题组统一命题&#xff0c;即全校的经济类(分布于经济学院、商学院、公共管理学院、国际关系学院、劳动人事学院等院系)研究生入学考试的“经济学综合…

PAT-Mars number

1100. Mars Numbers (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue People on Mars count their numbers with base 13: Zero on Earth is called "tret" on Mars. The numbers 1 to 12 on Earch is called…

[bzoj1011] [HNOI2008]遥远的行星

Description 直线上N颗行星&#xff0c;Xi处有行星i,行星J受到行星I的作用力&#xff0c;当且仅当i<AJ.此时J受到作用力的大小为 Fi->jMi*Mj/(j-i) 其中A为很小的常量&#xff0c;故直观上说每颗行星都只受到距离遥远的行星的作用。请计算每颗行星的受力 &#xff0c;只要…

[Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树]

【问题描述】[] 前序遍历 先输出当前结点的数据&#xff0c;再依次遍历输出左结点和右结点 中序遍历 先遍历输出左结点&#xff0c;再输出当前结点的数据&#xff0c;再遍历输出右结点 后续遍历 先遍历输出左结点&#xff0c;再遍历输出右结点&#xff0c;最后输出当前结点的数…

sqlserver:(2):window下SQL server数据库数据源的配置

1首先打开控制面板 2选择64位数据源 3添加 4选择sql server 做好配置&#xff0c;下一步 下一步 下一步 测试

聚类算法:K-Means

1.K-Means定义&#xff1a; K-Means是一种无监督的基于距离的聚类算法&#xff0c;简单来说&#xff0c;就是将无标签的样本划分为k个簇&#xff08;or类&#xff09;。它以样本间的距离作为相似性的度量指标&#xff0c;常用的距离有曼哈顿距离、欧几里得距离和闵可夫斯基距离…

html:(1) 登录界面

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><!-- content属性值 :width:可视区域的宽度&#xff0c;值可为数字或关键词device-widthheight:同widthintial-scale:页面首次被显示是可视区域的缩放级别&#x…

[Leedcode][JAVA][第5题][最长回文子串][数组][动态规划]

【问题描述】[第5题][最长回文子串][中等] 给定一个字符串 s&#xff0c;找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1&#xff1a;输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。【解答思路】 1. 中心扩展法…

一流大学计算机专业,计算机专业一流大学太难考,不妨退而求其次,看看这5所大学...

原标题&#xff1a;计算机专业一流大学太难考&#xff0c;不妨退而求其次&#xff0c;看看这5所大学因为就业率高、薪酬待遇好&#xff0c;又是前沿科技&#xff0c;所以计算机专业近一二十年来一直都很热门&#xff0c;开设计算机专业的院校也如雨后春笋一般冒了出来&#xff…

医疗:ICU(10)

国内护理高等教育、护理模式相对 落后&#xff1a;护士的主要学历仍然以中等 教育为主。 流失率高&#xff1a;中国至今不能形成护理 人员分级上岗的工作模式&#xff0c;护理学 大专生、本科生、硕士生所作的工 作和中专生完全一样。中国护士每 年以20%的比率流失&#xff0c…

[Leedcode][JAVA][第560题][和为K的子数组][Hashmap][数组]

【问题描述】[第560题][和为K的子数组][中等] 给定一个整数数组和一个整数 k&#xff0c;你需要找到该数组中和为 k 的连续的子数组的个数。示例 1 :输入:nums [1,1,1], k 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。 说明 :数组的长度为 [1, 20,000]。 数组中元素的范围…

html表格复制最后一行字,为什么Word中的表格输入文字最后一行文字会自动跳到下一页...

为什么Word中的表格输入文字最后一行文字会自动跳到下一页以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;为什么Word中的表格输入文字最后一行文字会自动跳到下一页, 在WPS文字中的表格中打…

购物车的基本流程

一、购物车的需求描述和基本流程1、需求描述1、 用户可以在登录状态下将商品添加到购物车 2、 用户可以在未登录状态下将商品添加到购物车 3、 用户可以使用购物车一起结算下单 4、 用户可以查询自己的购物车 5、 用户可以在购物车中可以修改购买商品的数量。 6、 用户可以在购…

医疗:ICU(9)

ICU:重症加强护理病房 把危重病人集中起来&#xff0c;在人力、物力和技术上给予最佳保障&#xff0c;以期 得到良好的救治效果&#xff1b;集中各有关专业的知识和技术&#xff0c;先进的监测 和治疗设备&#xff0c;对重症病例的生理功能进行严密监测和及时有效治疗 的专门单…

canvas填充规则

canvas填充规则 const canvas document.getElementById(canvas); const ctx canvas.getContext(2d);ctx.beginPath(); ctx.fillStylegreen ctx.arc(50, 50, 30, 0, Math.PI * 2, true); ctx.arc(50, 50, 20, 0, Math.PI * 2, true); ctx.arc(50, 50, 15, 0, Math.PI * 2, tr…