【问题描述】

【解答思路】

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

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

  1. 《LeetCode力扣练习》第155题 最小栈 Java

    <LeetCode力扣练习>第155题 最小栈 Java 一.资源 题目: 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. 实现 MinStack ...

  2. [Leedcode][JAVA][第445题][链表][栈]

    [问题描述]445. 两数相加 II 给你两个 非空 链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储一位数字.将这两数相加会返回一个新的链表.你可以假设除了数字 0 之外,这 ...

  3. LeetCode第155题—最小栈

    本次写的题目是最小栈,为LeetCode里面的题目,让我们来康康是如何解出这道题目的吧,各位尚没有思路的小伙伴可以跟随着博主的解题思路一步步来,感受一下

  4. LeetCode第155题 最小栈

    设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中.pop() -- 删除栈顶的元素.top() -- 获取栈顶元素.get ...

  5. [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]

    [问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...

  6. [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]

    [问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...

  7. [Leedcode][JAVA][第470题][Ran7()实现Rand10()]

    [问题描述][Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 ...

  8. Leetcode刷题笔记12:【20】有效的括号【155】最小栈【255】用队列实现栈(STL:stackC++ 单引号和双引号)

    第十天 2021-3-12 每日刷四题 刷题模块:栈 - 简单难度 一.STL:stack C++ stack(STL stack)用法详解 函数 方法 top() 返回一个栈顶元素的引用,类型为 T ...

  9. [Leedcode][JAVA][第84题][柱状图中最大的矩形][暴力][单调栈]

    [问题描述][困难] 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 .求在该柱状图中,能够勾勒出来的矩形的最大面积.以上是柱状图的示例,其中每个柱子的宽度为 1 ...

最新文章

  1. Java改知能机_Java 面试突击之 Java 并发知识基础 进阶考点全解析
  2. 【推荐】一下令人惊艳的的网站,绝对会让你爱上历史
  3. mysql中的乐观锁_MySQL中悲观锁和乐观锁到底是什么?
  4. C++描述杭电OJ 2009.求数列的和 ||
  5. new arraylist内存_如何避免内部类中的内存泄漏
  6. MySQL 十大常用字符串函数
  7. 深度学习中的损失函数如何画图_如何用深度学习来做检索:度量学习中关于排序损失函数的综述(1)...
  8. 样条曲面_用SolidWorks曲面制作一个:台灯底座造型
  9. Leave the world behind,山巅雪莲的再次绽放
  10. 数据科学包10-pandas高级内容之时间序列
  11. winfrom 窗口起始位置为屏幕中央
  12. 【CPU占用高】software_reporter_tool.exe
  13. Java编程笔记9:容器(下)
  14. 黑产反诈有方法,异常识别我在行—欺诈反洗钱等领域用得最多的经典算法
  15. glColor3f函数颜色
  16. 数据赋能,助力新零售数字化突围
  17. 简单的图书管理系统(类的练习)
  18. 蓝牙芯片排行_七月蓝牙芯片出货量排行榜TOP10
  19. 三菱PLC编程-MOV指令
  20. iOS --- OpenGLES之图片纹理

热门文章

  1. Shell 自定义函数
  2. Vertex and Fragment Shader
  3. 一个简单的 Generic Factory 类
  4. c++中怎么数组内有用元素的个数_前端面试(算法篇) - 数组乱序
  5. 本题要求实现一个用选择法对整数数组进行简单排序的函数。_通俗易懂讲 Python 算法:快速排序...
  6. html生成1-32位随机数,如何生成一个32位的随机数 | 求索阁
  7. @ConfigurationProperties + @EnableConfigurationProperties
  8. java使用AntPathMatcher进行uri匹配
  9. .Net 强名称签名程序集
  10. windows 下cmd命令行的替换工具cmder