剑指 Offer 31. 栈的压入、弹出序列(中等)

本文介绍了LeetCode中第31题的解决方案,通过优化后的代码分析了如何判断栈的合法压入弹出序列。重点讨论了栈操作的细节,包括避免空指针异常和比较技巧,同时提供了时间空间复杂度的分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:

利用一个栈

 

代码:

自己写的第一版

class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        if(pushed.length==0) return true;
		Deque<Integer> stack=new ArrayDeque<>();
                stack.addLast(pushed[0]);
		
		int i=1,j=0;
		while(i<pushed.length||!stack.isEmpty()){
			
			if(j<popped.length&&stack.peekLast()!=null&&stack.peekLast().equals(popped[j])){
				stack.removeLast();
                                j++;
			}
                        else if(i<pushed.length){
                            stack.addLast(pushed[i++]);
                        }
                        else{
                            return false;
                        }
		}
		
		return true;
    }
}

优化后的第二版

class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
		Deque<Integer> stack=new ArrayDeque<>();
		
        int j=0;
		for(int num:pushed){
			stack.addLast(num);
			//!stack.isEmpty的判断是放置stack.peekLast()出空指针异常
			while(!stack.isEmpty()&&stack.peekLast()==popped[j]){
				stack.removeLast();
				j++;
			}
		}
		
		return stack.isEmpty();
	}
}

 

分解:

1)stack.peekLast()==popped[j]不需要使用stack.peekLast().equals(),只要"=="就行,因为stack.peekLast()的是Integer,而popped[j]是int,==可以直接比较值。如果peekLast和removeLast比较,就要用.equals,如果用==,就会比较类型,会返回false

2)第二版中!stack.isEmpty的判断是放置stack.peekLast()出空指针异常,就像第一版中要先判断stack.peekLast()!=null

2)第一版比第二版冗杂多了,第二版代码简化了一点,但时间空间复杂度是一样的

 

 

复杂度分析:

时间复杂度:O(N) pushed和popped都要遍历一次,O(2N)

空间复杂度:O(N)额外使用了一个栈,最差情况下要存储N个值

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值