Skip to content

Commit 7cc6309

Browse files
authored
Create Readme.md
1 parent 74bf169 commit 7cc6309

File tree

1 file changed

+17
-0
lines changed

1 file changed

+17
-0
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
### 946.Validate-Stack-Sequences
2+
3+
本题的解法类似于贪心。我们从前往后观察pushed,一旦发现pushed末尾有任何长度的序列和poped队首的对应长度序列正好是反向关系,就将两者相消。然后继续观察剩下的pushed和poped,继续往后遍历pushed,做同样的操作。直到两者的序列都彼此消掉,说明两者对应的是一个合法的入栈/出栈操作。
4+
5+
```
6+
A B C D
7+
*******++++++*****++++++
8+
++++++ E
9+
---------- F
10+
*******++++++*****----------
11+
J I H G
12+
```
13+
举如上的例子,相同的序列段用同样的字符表示。实际栈操作的顺序是 +A +B +C +D -E +F -G -H -I -J。所以相应的pushed = ABCDF, poped = EGHIJ。其中D和E是对应的,F和G是对应的,H和C是对应的,I和B是对应的,J和A是对应的。
14+
15+
根据我们上述的算法,当查看到pushed里面的B时,发现恰好与poped中的E相同,根据规则需要将B和E进行相消。但实际上的操作里面,D与E才是相消关系。所以这种算法合理吗?
16+
17+
答案是合理的。因为尽管我们将B和E进行了错误的对消,但是必然存在D和I也可以在后续得到对消。不信我们试一试,此时栈操作的顺序(根据我们的算法理解)变相成了 +A +B -E +C +D +F -G -H -I -J,尽管提前做了出栈的操作-E,但总的pushed = ABCDF, poped = EGHIJ 依然不变。就是这么神奇。

0 commit comments

Comments
 (0)