[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 值即可。
【總結】
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题][最小栈][基本类型包装类]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017第18周四
- 下一篇: docker安装mangoDB