日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Leedcode][JAVA][第155题][最小栈][基本类型包装类] 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【問題描述】

【解答思路】

1. 兩個棧實現(xiàn)

1.1、輔助棧和數(shù)據(jù)棧同步

特點:編碼簡單,不用考慮一些邊界情況,就有一點不好:輔助棧可能會存一些“不必要”的元素。

1.2、輔助棧和數(shù)據(jù)棧不同步

特點:由“輔助棧和數(shù)據(jù)棧同步”的思想,我們知道,當數(shù)據(jù)棧進來的數(shù)越來越大的時候,我們要在輔助棧頂放置和當前輔助棧頂一樣的元素,這樣做有點“浪費”。基于這一點,我們做一些“優(yōu)化”,但是在編碼上就要注意一些邊界條件。

(1)輔助棧為空的時候,必須放入新進來的數(shù);

(2)新來的數(shù)小于或者等于輔助棧棧頂元素的時候,才放入,特別注意這里“等于”要考慮進去,因為出棧的時候,連續(xù)的、相等的并且是最小值的元素要同步出棧;

(3)出棧的時候,輔助棧的棧頂元素等于數(shù)據(jù)棧的棧頂元素,才出棧。

總結一下:出棧時,最小值出棧才同步;入棧時,最小值入棧才同步。

1.1、輔助棧和數(shù)據(jù)棧同步

import java.util.Stack;public class MinStack {// 數(shù)據(jù)棧private Stack<Integer> data;// 輔助棧private Stack<Integer> helper;/*** initialize your data structure here.*/public MinStack() {data = new Stack<>();helper = new Stack<>();}// 思路 1:數(shù)據(jù)棧和輔助棧在任何時候都同步public void push(int x) {// 數(shù)據(jù)棧和輔助棧一定會增加元素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、輔助棧和數(shù)據(jù)棧不同步

import java.util.Stack;public class MinStack {// 數(shù)據(jù)棧private Stack<Integer> data;// 輔助棧private Stack<Integer> helper;/*** initialize your data structure here.*/public MinStack() {data = new Stack<>();helper = new Stack<>();}// 思路 2:輔助棧和數(shù)據(jù)棧不同步// 關鍵 1:輔助棧的元素空的時候,必須放入新進來的數(shù)// 關鍵 2:新來的數(shù)小于或者等于輔助棧棧頂元素的時候,才放入(特別注意這里等于要考慮進去)// 關鍵 3:出棧的時候,輔助棧的棧頂元素等于數(shù)據(jù)棧的棧頂元素,才出棧,即"出棧保持同步"就可以了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. 鏈表同步法
  • 鏈表頭插法實現(xiàn)基本功能
  • 最小值實現(xiàn)在 Node 節(jié)點中增加一個 min 字段,每次加入一個節(jié)點的時候,只要確定它的 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;//每次加入的節(jié)點放到頭部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.思路總結 最小棧 兩個棧/一個棧+一個額外存儲 / 鏈表實現(xiàn)
2. 包裝類的用法

這里只討論六種數(shù)字基本類型對應的包裝類,因為它們是使用最頻繁的,這些類中常用的方法可分為兩類:一種是本類型與其它基本類型之間的轉換,另一種是字符串與本類型和基本類型之間的轉換。如下圖,是Integer類中的一些常用方法:

其中的前五個,都是屬于第一種,即與其它基本類型之間的轉換。下面的三個則屬于第二種,是字符串與本類型及基本類型之間的轉換。

A、本類型與其它類型轉換

示例如下:

Integer temp1 = new Integer(45);int temp2 = 45;byte t1 = temp1.byteValue(); //包裝類的轉換byte t2 = (byte)temp2; //基本數(shù)據(jù)類型的強制類型轉換

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***()靜態(tài)方法

c2b. 包裝類的valueOf()方法

//字符串轉換成基本類型的方法有兩種
String b = “121”;
int c1 = Integer.parseInt(b);
int c2 = Integer.valueOf(b);

3. java基本類型 & 包裝類 & 異同



3.Integer與int數(shù)據(jù)的比較

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题][最小栈][基本类型包装类]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。