LeetCode第62题: 不同路径
- 使用动态规划, 创建一个m行n列的数组, 第一行和第一列都标为一(如果数组只有一行或者一列, 返回1), 如果不是第一行或者第一列, 那么它的值就是它的左边加上他的上边. 返回值
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
if m <= 1 or n <= 1:
return 1
array = []
i = 0
j = 0
while i < m:
array.append([])
j = 0
while j < n:
array[i].append(0)
j += 1
i += 1
i = 1
while i < n:
array[0][i] = 1
i += 1
i = 1
while i < m:
array[i][0] = 1
i += 1
i = 1
while i < m:
j = 1
while j < n:
array[i][j] = array[i - 1][j] + array[i][j -1]
j += 1
i += 1
return array[m - 1][n - 1]
复杂度分析: 本算法需要遍历二维列表, 复杂度为O(mn)
LeetCode第70题: 爬楼梯
- 仍然是动态规划, steps[i] = steps[i -1] + steps[i - 2], 根据这个方程式可以推出第n阶台阶的结果树
class Solution:
def climbStairs(self, n: int) -> int:
l = [0] * (n + 1)
l[0] = 1
l[1] = 1
i = 2
while i <= n:
l[i] = l[i - 1] + l[i -2]
i += 1
return l[n]
LeetCode第78题: 子集
- 使用动态规划, 每个nums[i]的子集为nums[i - 1]的集合每一个元素与[nums[i]]的和在加上nums[i-1]的集合
class Solution:
def subsets(self, nums):
result = [[]]
length = len(nums)
for i in range(0, length):
mid = []
for j in range(0, len(result)):
mid.append(result[j][:])
for j in range(0, len(mid)):
mid[j] += [nums[i]]
# print(mid)
result += mid
return result