2022-2-27剑指offer day17

题1:

JZ30 包含min函数的栈

描述

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的 min 函数,输入操作时保证 pop、top 和 min 函数操作时,栈中一定有元素。   此栈包含的方法有: push(value):将value压入栈中 pop():弹出栈顶元素 top():获取栈顶元素 min():获取栈中最小元素   数据范围:操作数量满足 0 \le n \le 300 \0≤n≤300  ,输入的元素满足 |val| \le 10000 \∣val∣≤10000 
进阶:栈的各个操作的时间复杂度是 O(1)\O(1)  ,空间复杂度是 O(n)\O(n) 
  示例: 输入:    ["PSH-1","PSH2","MIN","TOP","POP","PSH1","TOP","MIN"] 输出:    -1,2,1,-1 解析: "PSH-1"表示将-1压入栈中,栈中元素为-1 "PSH2"表示将2压入栈中,栈中元素为2,-1 “MIN”表示获取此时栈中最小元素==>返回-1 "TOP"表示获取栈顶元素==>返回2 "POP"表示弹出栈顶元素,弹出2,栈中元素为-1 "PSH1"表示将1压入栈中,栈中元素为1,-1
"TOP"表示获取栈顶元素==>返回1 “MIN”表示获取此时栈中最小元素==>返回-1  
 1 import java.util.Stack;
 2 
 3 public class Solution {
 4     Stack<Integer> s1=new Stack<>();
 5     Stack<Integer> s2=new Stack<>();
 6     
 7     public void push(int node) {
 8         s1.push(node);
 9         if (s2.isEmpty()||s2.peek()>=node) {
10             s2.push(node);
11         }
12     }
13     
14     public void pop() {
15         int t=s1.pop();
16         if (t==s2.peek()) s2.pop();
17     }
18     
19     public int top() {
20         return s1.peek();
21     }
22     
23     public int min() {
24         return s2.peek();
25     }
26 }

思路:两个栈实现,第一个栈普通栈,第二个栈是递减的,放的数越来越小。出栈时如果是最小数,两个栈都得出栈。

 

题2:

JZ31 栈的压入、弹出序列

 

描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。 1. 0<=pushV.length == popV.length <=1000 2. -1000<=pushV[i]<=1000 3. pushV 的所有数字均不相同  
 1 import java.util.*;
 2 
 3 public class Solution {
 4     public boolean IsPopOrder(int [] pushA,int [] popA) {
 5     int p=0;
 6     Stack<Integer> stack=new Stack<>();
 7     for (int t:pushA){
 8         stack.push(t);
 9         while (!stack.isEmpty()&&stack.peek()==popA[p]){
10             p++;
11             stack.pop();
12         }
13     }
14     return stack.isEmpty();
15     
16     }}

思路:模拟。模拟压栈,如果栈顶元素与popA对应值相等,则出栈,popA指针向后移动。

上一篇:2022/2/26DP专题赛总结


下一篇:高二第二学期日记