Description
Say you have an array for which the ith element is the price of a given stock on day i.
If you were only permitted to complete at most one transaction (i.e., buy one and sell one share of the stock), design an algorithm to find the maximum profit.
Note that you cannot sell a stock before you buy one.
Example 1:
1 | Input: [7,1,5,3,6,4] |
Example 2:
1 | Input: [7,6,4,3,1] |
动态规划
分治和动态规划:不相交的子问题、相交的子问题
从斐波那契开始
最优解 vs 最优解的值
朴素递归 —— 自顶向下
因为子问题一般是重叠的,采用自顶向下的方式计算最优解的值会重复对多个相同的子问题求解,时间复杂度和空间复杂度都会指数增长。而自底向上的求解过程是递推式的进行,会先计算最基础的子问题,然后将子问题的结果缓存(可以仅仅缓存和下一个状态相关的子问题的解),所以我们一般采用自底向上的方式求解最优解的值。
带备忘录的自顶向下
一般步骤:
- 刻画一个最优解的结构特征。
- 递归定义最优解的值。
- 计算最优解的值,通常采用自底向上的方法。
- 利用计算出的信息构造一个最有解(可选)。
程序设计
1 | class Solution { |
内存优化
1 | class Solution { |
LIS 数量
定义问题
给定一个序列 $ X = <x_1, x_2, …, x_n> $,如果 $ Z = <z_1, z_2, … z_i> $ 是 X 的子序列,且满足:
$ z_i > z_(i-1) $,则 Z 是 X 的递增子序列 ,其中元素最多的递增子序列叫做 X 的最长递增子序列 (LIS)
刻画 LIS 的特征
假设 $ Z = <z_1, z_2, … z_i> $ 是 X 的一个 LIS,
- 那么 $Z_i > Z_(i-1)$
求 LIS 的长度
TODO LIST
https://leetcode.com/problems/number-of-longest-increasing-subsequence/
- https://leetcode.com/problems/predict-the-winner/
- https://leetcode.com/problems/minimum-ascii-delete-sum-for-two-strings/
- https://leetcode.com/problems/filling-bookcase-shelves/