栈
先进后出;push;pop
两种存储表示方式:顺序栈,链式栈
用数组实现一个顺序栈
1 | # coding:utf-8 |
用链表实现一个链式栈
使用head表示栈顶
1 | class Node: |
编程模拟实现一个浏览器的前进、后退功能
1 | # coding:utf-8 |
对应的 LeetCode 练习题
Valid Parentheses(有效的括号)
英文版:https://leetcode.com/problems/valid-parentheses/
中文版:https://leetcode-cn.com/problems/valid-parentheses/
1 | class Solution(object): |
Longest Valid Parentheses(最长有效的括号)
英文版:https://leetcode.com/problems/longest-valid-parentheses/
中文版:https://leetcode-cn.com/problems/longest-valid-parentheses/
参考:https://leetcode.com/problems/longest-valid-parentheses/solution/
改方法使用栈,先在栈底放入-1,然后放各个括号索引
1 | class Solution(object): |
测试用例
1 | s = Solution() |
Evaluate Reverse Polish Notatio(逆波兰表达式求值)
英文版:https://leetcode.com/problems/evaluate-reverse-polish-notation/
中文版:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
题中指明逆波兰式总是有效的,因此无需判定有效,直接使用栈解答
1 | class Solution: |
python除法可参考:python – 整数除以负数
更简洁的写法(耗时更长):
1 | class Solution: |
部分测试用例:
1 | s = Solution() |
队列
用数组实现一个顺序队列
1 | # coding:utf-8 |
用链表实现一个链式队列
1 | # coding:utf-8 |
实现一个循环队列
1 | class Queue: |
对应的 LeetCode 练习题
Circular Deque(设计一个双端队列)
英文版:https://leetcode.com/problems/design-circular-deque/
中文版:https://leetcode-cn.com/problems/design-circular-deque/
1 | class MyCircularDeque(object): |
部分测试用例
1 | circularDeque = MyCircularDeque(3) # 设置容量大小为3 |
Sliding Window Maximum(滑动窗口最大值)
英文版:https://leetcode.com/problems/sliding-window-maximum/
中文版:https://leetcode-cn.com/problems/sliding-window-maximum/
递归
实现斐波那契数列求值 f(n)=f(n-1)+f(n-2)
1 | # coding:utf-8 |
实现求阶乘 n!
1 | # coding:utf-8 |
实现一组数据集合的全排列
参考:https://blog.csdn.net/qq_42015869/article/details/79996227
1 | def perm(data, begin, end): |
对应的 LeetCode 练习题
70. 爬楼梯
方法一:斐波拉切(用时28 ms,击败了99.36%的用户)
观察发现是斐波拉切数,代码如下1
2
3
4
5
6
7
8
9
10
11
12
13class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
if n == 1:
return 1
else:
ans = [1, 1]
for i in range(2, n + 1):
ans.append(ans[i - 2] + ans[i - 1])
return ans[-1]
方法二:使用递归(超时)
这道题自顶向下的思考:如果要爬到
n
台阶,有两种可能性:
- 在
n-1
的台阶处爬一层台阶- 在
n-2
的台阶处爬两层台阶继续向下延伸思考,
到达每一次层一共有几种方法
这个问题就变成了2个子问题:
- 到达
n-1
层台阶有几种方法- 到达
n-2
层台阶有几种方法之后对返回子问题之和即可。
因为递归的时候出现了很多次重复的运算。如爬n-2层的计算出现了2次,这种重复计算随着input的增大,会出现的越来越多,时间复杂度也会将以指数的级别上升。
1 | class Solution(object): |
方法三:动态规划
优化方法二,将之前的计算好了的结果存起来,之后如果遇到重复计算直接调用结果,效率将会从之前的指数时间复杂度,变成O(N)的时间复杂度。1
2
3
4
5
6
7
8class Solution(object):
def climbStairs(self, n):
if n == 1: return 1
res = [0 for i in range(n)]
res[0], res[1] = 1, 2
for i in range(2, n):
res[i] = res[i-1] + res[i-2]
return res[-1]
参考:https://leetcode.com/problems/climbing-stairs/discuss/163347/Python-3000DP-or-tm