第一题:509. 斐波那契数
斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给你 n ,请计算 F(n) 。
class Solution:
def fib(self, n: int) -> int:
if n==0:
return 0
elif n==1:
return 1
else:
return self.fib(n-1) + self.fib(n-2)
结果:
第二题:1137. 第 N 个泰波那契数
泰波那契序列 Tn 定义如下:
T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2
给你整数 n,请返回第 n 个泰波那契数 Tn 的值。
class Solution:
def tribonacci(self, n: int) -> int:
if n==0:
return 0
if n<=2:
return 1
p = 0
q = r = 1
for i in range(3,n+1):
s = p + q + r
p,q,r = q,r,s
return s
结果:
第三题:70. 爬楼梯
假设你正在爬楼梯。需要 n
阶你才能到达楼顶。
每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
class Solution:
def climbStairs(self, n: int) -> int:
if n==1:
return 1
elif n==2:
return 2
p = 1
q = 2
for i in range(3,n+1):
s = p+q
p,q = q,s
return s
第四题:746. 使用最小花费爬楼梯
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
n = len(cost)
dp = [0] * (n + 1)
for i in range(2, n + 1):
dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])
return dp[n]
结果:
第五题:121. 买卖股票的最佳时机
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
代码:
class Solution:
def maxProfit(self, prices: List[int]) -> int:
dp = [0]
if not bool(prices):
return 0
else:
temp = prices[0]
for i in range(1,len(prices)):
temp = min(temp,prices[i])
dp.append(max(dp[i-1],prices[i] - temp))
return max(dp)
第六题:剑指 Offer II 095. 最长公共子序列
题目描述:
给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。
一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。
两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。
class Solution:
def longestCommonSubsequence(self, text1: str, text2: str) -> int:
m, n = len(text1), len(text2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(1, m + 1):
for j in range(1, n + 1):
if text1[i - 1] == text2[j - 1]:
dp[i][j] = dp[i - 1][j - 1] + 1
else:
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
return dp[m][n]
结果:
第七题:杨辉三角形
问题描述:
n = int(input(''))
arr = []
for i in range(n):
arr.append([])
for j in range(i+1):
if j == 0 or i == j:
arr[i].append(1)
else:
arr[i].append(arr[i-1][j-1] + arr[i-1][j])
print(" ".join(str(a) for a in arr[i]))
结果:
第八题:节点选择
def dfs(node,pre):
global value,table
for i in table.get(node):
if i !=pre:
dfs(i,node)
value[node][0]+=max(value[i][0],value[i][1])
value[node][1]+=value[i][0]
def main():
global value, table
n = int(input())
value = list(map(int, input().split()))
value = list(map(lambda x:[0,x],value))
value.insert(0,0)
table = {}
for i in range(n):
table.update({i + 1: []})
for i in range(n - 1):
father, child = list(map(int, input().split()))
table.get(father).append(child)
table.get(child).append(father)
print(table)
dfs(1,0)
print(max(value[1][0],value[1][1]))
if __name__=='__main__':
main()