1 #121-买卖股票的最佳时机
-
题目:
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
注意:你不能在买入股票前卖出股票。- 示例1:
输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票
- 示例2:
输入: [7,6,4,3,1] 输出: 0 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
-
分析:
- 分析1:动态规划
1 动态规划做题步骤- 明确 dp(i)dp(i) 应该表示什么(二维情况:dp(i)(j)dp(i)(j));
- 根据 dp(i)dp(i) 和 dp(i-1)dp(i−1) 的关系得出状态转移方程;
- 确定初始条件,如 dp(0)dp(0)。
2 d p [ i ] dp[i] dp[i] 表示前 i i i天的最大利润,因为我们始终要使利润最大化,则:
d p [ i ] = max ( d p [ i − 1 ] , d p[i]=\max (d p[i-1], dp[i]=max(dp[i−1], prices [ i ] − [i]- [i]− minprice ) ) )
- 分析2:最多进行 1 笔交易(k=1)【贪心】
只要记录前面的最小价格,将这个最小价格作为买入价格,然后将当前的价格作为售出价格,决定是否更新当前的最大收益。注意维护两个变量:前面的最小价格 和 当前的最大收益。
- 分析1:动态规划
-
答案:
- 答案1:
class Solution: def maxProfit(self, prices: List[int]) -> int: n = len(prices) if n == 0: return 0 # 边界条件 dp = [0] * n minprice = prices[0] for i in range(1, n): minprice = min(minprice, prices[i]) dp[i] = max(dp[i - 1], prices[i] - minprice) return dp[-1]
- 答案2:
class Solution: def maxProfit(self, prices: List[int]) -> int: n = len(prices) if n<=1: return 0 buy, profit = float('inf'), 0 # 买入值 和 利润 for curr in prices: profit = max(profit, curr-buy) buy = min(curr, buy) return profit
权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
```
参考
2 #122-买卖股票的最佳时机 II
- 题目:
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)- 示例1:
输入: [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
- 示例2:
输入: [1,2,3,4,5] 输出: 4 解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。 因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
- 分析:
需要找出所有的升区间,计算每个升区间的价格差(峰值减去谷值)作为收益,最后把所有升区间带来的收益求和就可以了。
对于升区间 [a, b, c, d],有 a <= b <= c <= d ,那么最大收益为 d - a。而 d - a = (d - c) + (c - b) + (b - a) ,因此每当访问到 prices[i] 比前一天价格高,即 prices[i] - prices[i-1] > 0,那么就把 prices[i] - prices[i-1] 添加到收益中。 - 答案:
3 #124-二叉树中的最大路径和
-
题目:
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。- 示例1:
输入:root = [1,2,3] 输出:6 解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6
- 示例2:
输入:root = [-10,9,20,null,null,15,7] 输出:42 解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42
- 示例1:
-
分析:
递归 -
答案:
class Solution: ans = float('-inf') def maxPathSum(self, root: TreeNode) -> int: def helper(node): if not node: return 0 l = helper(node.left) r = helper(node.right) self.ans = max(self.ans, max(l,0) + max(r, 0) + node.val) return max(l, r, 0) + node.val helper(root) return self.ans