1.题目
2.思路
一开始不知道有啥思路,想过递归DFS,后来感觉不行。
后来想能不能模拟。看一下有没有规律。发现有个很有意思的点。
- 1.如果保证了第一个元素是最后弹出,那么可以过80多个用例。return poped[n - 1] == pushed[0]
- 2.发现有的用例过不了,因为还可以第一个元素最先被弹出,加一个或|| poped[0] == pushed[0],发现可以过116个用例。
- 3.然后就不知道咋做了。。。。看答案。果然栈的题目还是得靠栈来解决!!!!
正解--辅助栈--O(N)-4ms
先挨个将pushed元素压入栈,如何判断栈顶元素和poped[i]是否相等
- 如果相等:那么弹出栈顶元素,继续判断栈顶
- 如果不等,那么继续压入元素
最终结果:返回栈是否为空 或者 i 是否 等于 n
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
// 1.错误方法:保证第一个数,肯定是最后弹出。(或者是最先弹出) --能过116个用例,简直离谱!!!
// int n = pushed.length;
// if(n == 0) return true;
// return popped[n - 1] == pushed[0] || pushed[0] == popped[0];
// 辅助栈.O(n + n)
// 每次判断栈顶元素和poped元素是否相等
// 相等就一致弹出,不相等,就压入栈。
int n = pushed.length;
if(n == 0) return true;
Stack<Integer>stack = new Stack();
int i = 0;
for(int num : pushed){
stack.push(num);
while(!stack.isEmpty() && stack.peek() == popped[i]){
i++;
stack.pop(); //只要栈顶相等,就一直弹出元素
}
// while循环结束说明要么不相等了,要么为空了,这两种情况都应该压入栈了。
}
// for循环外,如果把所有的元素都压入栈中模拟完,如果仍然还有元素在栈中,说明为false.(或者 return i == n)
return stack.isEmpty();
// return i == n; //两种返回都是ok
}
}
3.结果
为啥是4ms ,不是0ms?
别人应该是采取了类似双指针移动的方式,会更快一点,代码中有两个while循环,但是我觉得写成这个样子已经很简洁了,时间复杂度也是O(N)。
4.想法
1.做不出来的时候,可以想一下特殊用例,找找规律,说不定也可以过一些例子,在笔试的时候可以尝试一下。
2.思路是来源于题干的,首先看题中用到的数据结构和数组大小,如果思路错了,那么做出来的可能性很难,或者代码很差。