1)取最大值,最小值
min()可以用min = min > node? node:min;代替
2)swap the number
可以用+/-或者异或等具有可逆性质的符号来操作,省去了中间变量。
包含min函数的栈
1)常规做法采用另外一个stack_min来记录最小值,当栈顶元素与stack_min栈顶元素相同时候,一起弹出。最后取stack_min的peek()函数便是最小值。
2)采用一个stack来维护的方法:
import java.util.Stack;
public class Solution {
private static Stack<Integer> stack = new Stack<Integer>();
int min = Integer.MAX_VALUE;
public void push(int node) {
if(min > node){
stack.push(min);
min = node;
}
stack.push(node);
}
public void pop() {
if(stack.size()==1){
return ;
}
if(min==stack.peek()){
stack.pop();
min=stack.peek();
}
stack.pop();
}
public int top() {
return stack.peek();
}
public int min() {
return min;
}
}
栈的压入和弹出
刚开始题解错了题意,以为是重复的压入再弹出,这样不就成了重排序了嘛?不管弹出是什么结果都可以实现,最后看了解答才明白了只有一次压入的机会,弹出了就不能再压入了。
因此可以把问题想成了单次操作,栈的大小有1,2,3…n种情况,每次判断压入的栈顶元素与弹出popA()的第一个元素是否相同,相同就弹出判断下一位,不同就继续压入,若最终stack栈的元素为空则可以按这个顺序输出。
import java.util.*;
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
Stack<Integer> stack = new Stack<Integer>();
int j = 0 ;
for(int i = 0 ; i < pushA.length; i ++){
stack.push(pushA[i]);
while(!stack.isEmpty() && stack.peek() == popA[j]){
stack.pop();
j++;
}
}
return stack.isEmpty();
}
}