Leetcode精选50题-Day10
121 买卖股票的最佳时机
1. 题目描述
2. 思路&代码
双指针法
class Solution:
def maxProfit(self, prices: List[int]) -> int:
max_profit = 0
for i in range(len(prices)):
for j in range(i+1, len(prices)):
profit = prices[j]-prices[i]
max_profit = max(max_profit, profit)
return max_profit
复杂度分析
- 时间复杂度: O ( n 2 ) O(n^2) O(n2),循环运行 n ( n − 1 ) 2 \dfrac{n (n-1)}{2} 2n(n−1) 次。
- 空间复杂度: O ( 1 ) O(1) O(1)。只使用了常数个变量。
一次遍历法
class Solution:
def maxProfit(self, prices: List[int]) -> int:
minprice = float('inf')
maxprofit = 0
for price in prices:
minprice = min(minprice, price)
maxprofit = max(maxprofit, price - minprice)
return maxprofit
作者:z1m
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/solution/gu-piao-wen-ti-python3-c-by-z1m/
复杂度分析
- 时间复杂度: O ( n ) O(n) O(n),只需要遍历一次。
- 空间复杂度: O ( 1 ) O(1) O(1),只使用了常数个变量。
122 买卖股票的最佳时机 II
1. 题目描述
给定一个数组,它的第 i i i 个元素是一支给定股票第 i i i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
2. 思路&代码
class Solution:
def maxProfit(self, prices: List[int]) -> int:
profit = 0
for i in range(1, len(prices)):
tmp = prices[i] - prices[i - 1]
if tmp > 0: profit += tmp
return profit
作者:jyd
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/solution/best-time-to-buy-and-sell-stock-ii-zhuan-hua-fa-ji/
124 二叉树中的最大路径和
1. 题目描述
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点
r
o
o
t
root
root ,返回其 最大路径和 。
提示:
- 树中节点数目范围是 [ 1 , 3 ∗ 1 0 4 ] [1, 3 * 10^4] [1,3∗104]
- − 1000 < = N o d e . v a l < = 1000 -1000 <= Node.val <= 1000 −1000<=Node.val<=1000
2. 思路&代码
首先,考虑实现一个简化的函数 m a x G a i n ( n o d e ) maxGain(node) maxGain(node),该函数计算二叉树中的一个节点的最大贡献值,具体而言,就是在以该节点为根节点的子树中寻找以该节点为起点的一条路径,使得该路径上的节点值之和最大。
具体而言,该函数的计算如下。
空节点的最大贡献值等于 0 0 0。
非空节点的最大贡献值等于节点值与其子节点中的最大贡献值之和(对于叶节点而言,最大贡献值等于节点值)。
对根节点调用函数 m a x G a i n maxGain maxGain,即可得到每个节点的最大贡献值。
根据函数 m a x G a i n maxGain maxGain 得到每个节点的最大贡献值之后,如何得到二叉树的最大路径和?对于二叉树中的一个节点,该节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值,如果子节点的最大贡献值为正,则计入该节点的最大路径和,否则不计入该节点的最大路径和。维护一个全局变量 m a x S u m maxSum maxSum 存储最大路径和,在递归过程中更新 m a x S u m maxSum maxSum 的值,最后得到的 m a x S u m maxSum maxSum 的值即为二叉树中的最大路径和。
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