输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
示例 1:
输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1] 输出:true 解释:我们可以按以下顺序执行: push(1), push(2), push(3), push(4), pop() -> 4, push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
示例 2:
输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2] 输出:false 解释:1 不能在 2 之前弹出。
题解:采用HashMap保存出栈入栈顺序,之后取出出栈顺序,判断每个位置的合法性
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
Map<Integer,Integer> map=new HashMap<Integer,Integer>();
Map<Integer,Integer> mapIndex=new HashMap<Integer,Integer>();
//将入栈顺序保存到hash表中
for(int i=0;i<pushed.length;i++){
map.put(pushed[i],i);
}
//将出栈顺序保存在hash表中
for(int i=0;i<popped.length;i++){
mapIndex.put(popped[i],map.get(popped[i]));
}
//取出出栈顺序
int[] indexPop=new int[popped.length];
for(int i=0;i<popped.length;i++){
indexPop[i]=mapIndex.get(popped[i]);
}
//遍历出栈顺序集合indexPop
for(int i=0;i<popped.length;i++){
int index=indexPop[i];
//验证每个位置的合法性
boolean isTrue=check(indexPop,index,i+1);
if(!isTrue){
return false;
}
}
return true;
}
public boolean check(int[] indexPop,int index,int start){
int min=Integer.MAX_VALUE;
for(int i=start;i<indexPop.length;i++){
//每个位置在以下两种情况为合法的
//1、当前遍历的下标大于当前需要判断是否合法位置的下标
//2、当前遍历的小标小于需要判断是否合法位置的下标,则后续位置需要是从小到大的顺序排
//列,且每个位置需要小于最小值
if(indexPop[i]>index||(indexPop[i]<index&&indexPop[i]<min&&indexPop[i]<indexPop[i-1])){
}else{
return false;
}
//保存最小值,防止存在入栈为[1,2,3,4,5],出栈为[4,3,1,5,2]的情况
min=Math.min(min,indexPop[i]);
}
return true;
}
}