table of Contents
062 Different paths
Title description
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
例如,上图是一个7 x 3 的网格。有多少可能的路径?
说明:m 和 n 的值均不超过 100。
示例 1:
输入: m = 3, n = 2
输出: 3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右
Problem solving method
Violence law
python code
class Solution:
def uniquePaths(self, m, n):
"""
:type m: int
:type n: int
:rtype: int
"""
dmap = [[0] * n for _ in range(m)]
for i in range(m):
dmap[i][0] = 1
for j in range(n):
dmap[0][j] = 1
for i in range(1, m):
for j in range(1, n):
l = u = 0
if i-1 >= 0:
u = dmap[i-1][j]
if j-1>= 0:
l = dmap[i][j-1]
dmap[i][j] = l + u
return dmap[m-1][n-1]
070 Climbing the stairs
Title description
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
Problem solving method
Violence law
python code
class Solution(object):
# def climbStairs(self, n):
# """
# :type n: int
# :rtype: int
# """
# dp = [0] * (n + 1)
# dp[0] = 1
# dp[1] = 1
# for i in range(2, n + 1):
# dp[i] = dp[i - 2] + dp[i- 1]
# return dp[n]
def climbStairs(self, n):
if n <= 1:
return 1
dp = [1] * 2
for i in range(2, n + 1):
dp[1], dp[0] = dp[1] + dp[0], dp[1]
return dp[1]
078 Subset
Title description
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
Problem solving method
Sort
python code
class Solution(object):
# def subsets(self, nums):
# """
# :type nums: List[int]
# :rtype: List[List[int]]
# """
# nums.sort()
# res = [[]]
# res.append(list(nums))
# for ls in range(1, len(nums)):
# self.get_subsets(res, nums, [], ls, 0)
# return res
#
# def get_subsets(self, res, nums, curr_set, ls, index):
# # recursive
# if ls == 0:
# res.append(list(curr_set))
# elif index < len(nums):
# curr_set.append(nums[index])
# self.get_subsets(res, nums, curr_set, ls - 1, index + 1)
# curr_set.pop()
# self.get_subsets(res, nums, curr_set, ls, index + 1)
# def subsets(self, nums):
# # https://leetcode.com/discuss/89343/c-8-lines-bit-operation
# # doesn't work when len(nums) > 32
# nums.sort()
# res = []
# for i in range(1 << len(nums)):
# res.append(self.get_subsets(nums, i))
# return res
#
# def get_subsets(self, nums, magic):
# res = []
# for i in range(len(nums)):
# if (1 << i) & magic != 0:
# res.append(nums[i])
# return res
def subsets(self, nums):
# Sort and iteratively generate n subset with n-1 subset, O(n^2) and O(2^n)
nums.sort()
res = [[]]
for index in range(len(nums)):
size = len(res)
# use existing subsets to generate new subsets
for j in range(size):
curr = list(res[j])
curr.append(nums[index])
res.append(curr)
return res