写在最前面,编程一直是我的短板,希望在leetcode练习中获得进步!
参考Datawhale组队学习中“LeetCodeTencent”
题目一121 买入卖出股票的最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。
只买一次,只买一只股票
思路
枚举法
第一想到的是枚举,全部例举一遍:
class Solution:
def maxProfit(self, prices: List[int]) -> int:
length = len(prices)
max_profit = 0
# 2个for循环遍历所有可能
for i in range(length):
for j in range(i,length):
cur_profit = prices[j]-prices[i]
if cur_profit > max_profit:
max_profit = cur_profit #记录最大利润
if max_profit < 0:
max_profit = 0
return max_profit
时间复杂度O(N^2)
最小-最大值
计算每次 到当天为止 的最小股票价格和最大利润
class Solution:
def maxProfit(self, prices: List[int]) -> int:
max_profit = 0
min_price = prices[0]
for price in prices:
if price < min_price:
min_price=price
cur_profit = price-min_price
if cur_profit > max_profit:
max_profit = cur_profit
if max_profit < 0:
max_profit = 0
return max_profit
题目二121 买入卖出股票的最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
可以买多次,买的仍是一只股票
思路
一次遍历
寻找上升趋势
class Solution:
def maxProfit(self, prices: List[int]) -> int:
length = len(prices)
deltas = []
for i in range(1,length):
delta = prices[i] - prices[i-1]
if delta < 0:
delta = 0
deltas.append(delta)
max_profit = sum(deltas)
return max_profit
题目三124 二叉树中的最大路径和
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
思路
递归
class Solution:
def __init__(self):
self.maxSum = float("-inf")
def maxPathSum(self, root: TreeNode) -> int:
def maxGain(node):
if not node:
return 0
# 递归计算左右子节点的最大贡献值
# 只有在最大贡献值大于 0 时,才会选取对应子节点
leftGain = max(maxGain(node.left), 0)
rightGain = max(maxGain(node.right), 0)
# 节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值
priceNewpath = node.val + leftGain + rightGain
# 更新答案
self.maxSum = max(self.maxSum, priceNewpath)
# 返回节点的最大贡献值
return node.val + max(leftGain, rightGain)
maxGain(root)
return self.maxSum