2021-12-11 每日打卡:腾讯精选50题
写在前面
“这些事儿在熟练之后,也许就像喝口水一样平淡,但却能给初学者带来巨大的快乐,我一直觉得,能否始终保持如初学者般的热情、专注,决定了在做某件事时能走多远,能做多好。” 该系列文章由python编写,遵循LeetBook 列表/腾讯的刷题顺序,所有代码已通过。每日3道,随缘剖析,希望风雨无阻,作为勉励自己坚持刷题的记录。
53. 最大子数组和
- 动态规划:
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
res = -float("inf")
start, n = 0, len(nums)
while res<0 and start<n:
res=max(nums[start],res)
start+=1
pre = res if res>0 else 0
for i in range(start, n):
# 一定要想明白dp意义:要么是继承上一个,要么是重新开始
pre = max(pre+nums[i],nums[i])
res = max(pre, res)
return res
62. 不同路径
- 动态规划:
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
dp = [[1]*n for _ in range(m)]
# 机器人可以从上面或者左边走来
for i in range(1,m):
for j in range(1,n):
dp[i][j] = dp[i-1][j]+dp[i][j-1]
return dp[m-1][n-1]
- 动态规划优化版1:
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
pre = [1] * n
dp = [1] * n
for i in range(1, m):
for j in range(1, n):
# 每次更新的都是一整行,pre对应的是相应列坐标的上面一个
dp[j] = pre[j] + dp[j-1]
pre = dp[:]
return pre[-1]
- 动态规划优化版2【第一遍未写出】,有被惊艳到:
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
dp = [1] * n
for i in range(1, m):
for j in range(1, n):
dp[j] += dp[j-1]
return cur[-1]
- 找规律法:
譬如2,2的方格,对应结果为2条路径。
把每段路径看作不同的段,所有可以走的路径分别是向左和向下的和m+n-2,而每一个位置都可以选择向下or向右走:
class Solution(object):
import math
def uniquePaths(self, m, n):
# return math.comb(m+n-2,m-1)
return math.comb(m+n-2,n-1)
70. 爬楼梯
- 经典题目:
class Solution:
def climbStairs(self, n: int) -> int:
dp={1:1,2:2}
for _ in range(3,n+1):
dp[_] = dp[_-1]+dp[_-2]
return dp[n]