From edd9ed4036b29878803f56695140ee336e98412c Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Tue, 29 Dec 2020 09:31:49 +0800 Subject: [PATCH] Update --- pics/123.买卖股票的最佳时机III.png | Bin 0 -> 52053 bytes problems/0121.买卖股票的最佳时机.md | 71 +++++++++ .../0123.买卖股票的最佳时机III.md | 140 ++++++++++++++++++ .../0188.买卖股票的最佳时机IV.md | 127 ++++++++++++++++ problems/0205.同构字符串.md | 2 + ...买卖股票的最佳时机含手续费.md | 78 ++++++++-- problems/0738.单调递增的数字.md | 49 +++++- 7 files changed, 448 insertions(+), 19 deletions(-) create mode 100644 pics/123.买卖股票的最佳时机III.png create mode 100644 problems/0121.买卖股票的最佳时机.md create mode 100644 problems/0123.买卖股票的最佳时机III.md create mode 100644 problems/0188.买卖股票的最佳时机IV.md diff --git a/pics/123.买卖股票的最佳时机III.png b/pics/123.买卖股票的最佳时机III.png new file mode 100644 index 0000000000000000000000000000000000000000..1037b6901bcb9d20954131a1ea1b552b2834bcd1 GIT binary patch literal 52053 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 literal 0 HcmV?d00001 diff --git a/problems/0121.买卖股票的最佳时机.md b/problems/0121.买卖股票的最佳时机.md new file mode 100644 index 00000000..f59e761e --- /dev/null +++ b/problems/0121.买卖股票的最佳时机.md @@ -0,0 +1,71 @@ + +# 思路 + +## 暴力 + +这道题目最直观的想法,就是暴力,找优间距了。 + +``` +class Solution { +public: + int maxProfit(vector& prices) { + int result = 0; + for (int i = 0; i < prices.size(); i++) { + for (int j = i + 1; j < prices.size(); j++){ + result = max(result, prices[j] - prices[i]); + } + } + return result; + } +}; +``` + +* 时间复杂度:O(n^2) +* 空间复杂度:O(1) + +当然该方法超时了。 + + +## 贪心 + +因为股票就买卖一次,那么贪心的想法很自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利润。 + +C++代码如下: + +```C++ +class Solution { +public: + int maxProfit(vector& prices) { + int low = INT_MAX; + int result = 0; + for (int i = 0; i < prices.size(); i++) { + low = min(low, prices[i]); // 取最左最小价格 + result = max(result, prices[i] - low); // 直接取最大区间利润 + } + return result; + } +}; +``` + +## 动态规划 + +dp[i][0] 表示第i天持有股票所得现金 +dp[i][1] 表示第i天不持有股票所得现金 + +``` +class Solution { +public: + int maxProfit(vector& prices) { + int n = prices.size(); + if (n == 0) return 0; + vector> dp(n, vector(2, 0)); + dp[0][0] -= prices[0]; // 持股票 + for (int i = 1; i < n; i++) { + dp[i][0] = max(dp[i - 1][0], -prices[i]); // 买入 + dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]); // 卖出 + } + return dp[n - 1][1]; + } +}; +``` + diff --git a/problems/0123.买卖股票的最佳时机III.md b/problems/0123.买卖股票的最佳时机III.md new file mode 100644 index 00000000..c515f669 --- /dev/null +++ b/problems/0123.买卖股票的最佳时机III.md @@ -0,0 +1,140 @@ +# 思路 + +这道题目相对 121.买卖股票的最佳时机 和 122.买卖股票的最佳时机II 难了不少。 + +关键在于至多买卖两次,这意味着可以买卖一次,可以买卖两次,也可以不买卖。 + +接来下我用动态规划五部曲详细分析一下: + +### 确定dp数组以及下标的含义 + +一天一共就有五个状态, +0. 没有操作 +1. 第一次买入 +2. 第一次卖出 +3. 第二次买入 +4. 第二次卖出 + +dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。 + +### 确定递推公式 + +dp[i][0] = dp[i - 1][0]; + +需要注意:dp[i][1],**表示的是第i天,买入股票的状态,并不是说一定要第i天买入股票,这是很多同学容易陷入的误区**。 + +达到dp[i][1]状态,有两个具体操作: + +* 操作一:第i天买入股票了,那么dp[i][1] = dp[i-1][0] - prices[i] +* 操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = dp[i - 1][0] + +那么dp[i][1]究竟选 dp[i-1][0] - prices[i],还是dp[i - 1][0]呢? + +一定是选最大的,所以 dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][0]); + +同理dp[i][2]也有两个操作: + +* 操作一:第i天卖出股票了,那么dp[i][2] = dp[i - 1][i] + prices[i] +* 操作二:第i天没有操作,沿用前一天卖出股票的状态,即:dp[i][2] = dp[i - 1][2] + +所以dp[i][2] = max(dp[i - 1][i] + prices[i], dp[i][2]) + +同理可推出剩下状态部分: + +dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]); +dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]); + + +### dp数组如何初始化 + + +第0天没有操作,这个最容易想到,就是0,即:dp[0][0] = 0; + +第0天做第一次买入的操作,dp[0][1] = -prices[0]; + +第0天做第一次卖出的操作,这个初始值应该是多少呢? + +首先卖出的操作一定是收获利润,整个股票买卖最差情况也就是没有盈利即全程无操作现金为0, + +从递推公式中可以看出每次是取最大值,那么既然是收获利润如果比0还小了就没有必要收获这个利润了。 + +所以dp[0][2] = 0; + +第0天第二次买入操作,初始值应该是多少呢? + +不用管第几次,现在手头上没有现金,只要买入,现金就做相应的减少。 + +所以第二次买入操作,初始化为:dp[0][3] = -prices[0]; + +同理第二次卖出初始化dp[0][4] = 0; + +### 确定遍历顺序 + +从递归公式其实已经可以看出,一定是从前向后遍历,因为dp[i],依靠dp[i - 1]的数值。 + + +### 举例推导dp数组 + +以输入[1,2,3,4,5]为例 + + +![123.买卖股票的最佳时机III](https://img-blog.csdnimg.cn/20201228181724295.png) + +红色为最终求解。 + +因为利润最大一定是卖出的状态,所以最终最大利润是max(dp[4][2], dp[4][4]); + +### C++代码 + +以上五步都分析完了,不难写出如下代码: + +``` +class Solution { +public: + int maxProfit(vector& prices) { + if (prices.size() == 0) return 0; + vector> dp(prices.size(), vector(5, 0)); + dp[0][0] = 0; + dp[0][1] = -prices[0]; + dp[0][3] = -prices[0]; + for (int i = 1; i < prices.size(); i++) { + dp[i][0] = dp[i - 1][0]; + dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]); + dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i]); + dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]); + dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]); + } + return max(dp[prices.size() - 1][2], dp[prices.size() - 1][4]); + + } +}; +``` + +* 时间复杂度:O(n) +* 空间复杂度:O(n * 5) + + + +当然,大家在网上看到的题解还有一种优化空间写法,如下: + +``` +class Solution { +public: + int maxProfit(vector& prices) { + if (prices.size() == 0) return 0; + vector dp(5, 0); + dp[0] = 0; + dp[1] = -prices[0]; + dp[3] = -prices[0]; + for (int i = 1; i < prices.size(); i++) { + dp[1] = max(dp[1], dp[0] - prices[i]); + dp[2] = max(dp[2], dp[1] + prices[i]); + dp[3] = max(dp[3], dp[2] - prices[i]); + dp[4] = max(dp[4], dp[3] + prices[i]); + } + return max(dp[2], dp[4]); + + } +}; +``` +但这种写法,dp[2] 利用的是当天的dp[1],我还没有理解为什么这种写法也可以通过,网上的题解也没有做出解释,可能这就是神代码吧,欢迎大家来讨论一波! diff --git a/problems/0188.买卖股票的最佳时机IV.md b/problems/0188.买卖股票的最佳时机IV.md new file mode 100644 index 00000000..e67b785b --- /dev/null +++ b/problems/0188.买卖股票的最佳时机IV.md @@ -0,0 +1,127 @@ + +# 思路 + +这道题目可以说是123.买卖股票的最佳时机III的进阶版, 这里要求至多有k次交易。 + +在123.买卖股票的最佳时机III中,我是定义了一个二维dp数组,本题其实依然可以用一个二维dp数组。 + +动规五部曲,分析如下: + +### 确定dp数组以及下标的含义 + +使用二维数组 dp[i][j] :第i天的状态为j,所剩下的最大现金是dp[i][j] + +j的状态表示为: + +* 0 表示不操作 +* 1 第一次买入 +* 2 第一次卖出 +* 3 第一次买入 +* 4 第一次卖出 +..... + +大家应该发现规律了吧 ,除了0以外,偶数就是卖出,奇数就是买入。 + +题目要求是至多有K笔交易,那么j的范围就定义为 2 * k + 1 就可以了。 + +所以二维dp数组的C++定义为: + +``` +vector> dp(prices.size(), vector(2 * k + 1, 0)); +``` + +### 确定递推公式 + +在123.买卖股票的最佳时机III中 + +需要注意:dp[i][1],**表示的是第i天,买入股票的状态,并不是说一定要第i天买入股票,这是很多同学容易陷入的误区**。 + +达到dp[i][1]状态,有两个具体操作: + +* 操作一:第i天买入股票了,那么dp[i][1] = dp[i-1][0] - prices[i] +* 操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = dp[i - 1][0] + +那么dp[i][1]究竟选 dp[i-1][0] - prices[i],还是dp[i - 1][0]呢? + +一定是选最大的,所以 dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][0]); + +同理dp[i][2]也有两个操作: + +* 操作一:第i天卖出股票了,那么dp[i][2] = dp[i - 1][i] + prices[i] +* 操作二:第i天没有操作,沿用前一天卖出股票的状态,即:dp[i][2] = dp[i - 1][2] + +所以dp[i][2] = max(dp[i - 1][i] + prices[i], dp[i][2]) + +同理可推出剩下状态部分: + +dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]); +dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]); + +* dp数组如何初始化 +* 确定遍历顺序 +* 举例推导dp数组 + +``` +class Solution { +public: + int maxProfit(int k, vector& prices) { + + if (prices.size() == 0) return 0; + vector> dp(prices.size(), vector(2 * k + 1, 0)); + for (int j = 1; j < 2 * k; j += 2) { + dp[0][j] = -prices[0]; + } + for (int i = 1;i < prices.size(); i++) { + for (int j = 0; j < 2 * k - 1; j += 2) { // 注意这里是等于 + dp[i][j + 1] = max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]); + dp[i][j + 2] = max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]); + } + } + int result = 0; + for (int j = 2; j <= 2 * k; j += 2) { + result = max(result, dp[prices.size() - 1][j]); + } + return result; + } +}; +``` + +``` +class Solution { +public: + int maxProfit(int k, vector& prices) { + const int n = prices.size(); + if (n == 0) return 0; + vector dp(2 * k + 1, 0); + for (int i = 1;i < 2 * k;i += 2) + dp[i] = -prices[0]; + for (int i = 1;i < n;++i) { + for (int j = 0;j < 2 * k;j += 2) { + dp[j] = max(dp[j], dp[j + 1] + prices[i]); + dp[j + 1] = max(dp[j + 1], dp[j + 2] - prices[i]); + } + } + return dp[0]; + } +}; + + +class Solution { +public: + int maxProfit(vector& prices) { + if (prices.size() == 0) return 0; + vector> dp(prices.size(), vector(5, 0)); + dp[0][0] = 0; + dp[0][1] = -prices[0]; + dp[0][3] = -prices[0]; + for (int i = 1; i < prices.size(); i++) { + dp[i][0] = dp[i - 1][0]; + dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]); + dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i]); + dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]); + dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]); + } + return max(dp[prices.size() - 1][2], dp[prices.size() - 1][4]); + + } +}; diff --git a/problems/0205.同构字符串.md b/problems/0205.同构字符串.md index 38d5579e..071a562d 100644 --- a/problems/0205.同构字符串.md +++ b/problems/0205.同构字符串.md @@ -4,6 +4,8 @@ https://leetcode-cn.com/problems/isomorphic-strings/ ## 思路 +字符串没有说都是小写字母之类的,所以用数组不合适了,用map来做映射。 + 使用两个map 保存 s[i] 到 t[j] 和 t[j] 到 s[i] 的映射关系,如果发现对应不上,立刻返回 false ## C++代码 diff --git a/problems/0714.买卖股票的最佳时机含手续费.md b/problems/0714.买卖股票的最佳时机含手续费.md index 3b5b6340..f9e632d8 100644 --- a/problems/0714.买卖股票的最佳时机含手续费.md +++ b/problems/0714.买卖股票的最佳时机含手续费.md @@ -1,24 +1,55 @@ +> + +# 714. 买卖股票的最佳时机含手续费 + +题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/ + +给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。 + +你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。 + +返回获得利润的最大值。 + +注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。 + +示例 1: +输入: prices = [1, 3, 2, 8, 4, 9], fee = 2 +输出: 8 + +解释: 能够达到的最大利润: +在此处买入 prices[0] = 1 +在此处卖出 prices[3] = 8 +在此处买入 prices[4] = 4 +在此处卖出 prices[5] = 9 +总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8. + +注意: +* 0 < prices.length <= 50000. +* 0 < prices[i] < 50000. +* 0 <= fee < 50000. # 思路 + 本题相对于[贪心算法:122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/VsTFA6U96l18Wntjcg3fcg),多添加了一个条件就是手续费。 ## 贪心算法 -在[贪心算法:122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/VsTFA6U96l18Wntjcg3fcg)中使用贪心策略不用关系具体什么时候买卖,只要收集每天的正利润,最后稳稳的就是最大利润了。 +在[贪心算法:122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/VsTFA6U96l18Wntjcg3fcg)中使用贪心策略不用关心具体什么时候买卖,只要收集每天的正利润,最后稳稳的就是最大利润了。 -而本题有了手续费,就要关系什么时候买卖了,因为只计算所获得利润,可能不足以手续费。 +而本题有了手续费,就要关系什么时候买卖了,因为计算所获得利润,需要考虑买卖利润可能不足以手续费的情况。 如果使用贪心策略,就是最低值买,最高值(如果算上手续费还盈利)就卖。 此时无非就是要找到两个点,买入日期,和卖出日期。 * 买入日期:其实很好想,遇到更低点就记录一下。 -* 卖出日期:这个就不好算了,但也没有必要算出准确的卖出日期,只要当前价格大于(最低价格+费用),就可以收获利润,至于准确的卖出日期,就是连续收获利润区间里的最后一天。 +* 卖出日期:这个就不好算了,但也没有必要算出准确的卖出日期,只要当前价格大于(最低价格+手续费),就可以收获利润,至于准确的卖出日期,就是连续收获利润区间里的最后一天(并不需要计算是具体哪一天)。 -所以我们在做收获利润操作的时候其实有两种情况: +所以我们在做收获利润操作的时候其实有三种情况: * 情况一:收获利润的这一天并不是收获利润区间里的最后一天(不是真正的卖出,相当于持有股票),所以后面要继续收获利润。 -* 情况二:收获利润的这一天是收获利润区间里的最后一天(相当于真正的卖出了),后面要重新记录最小价格了。 +* 情况二:前一天是收获利润区间里的最后一天(相当于真正的卖出了),今天要重新记录最小价格了。 +* 情况三:不作操作,保持原有状态(买入,卖出,不买不卖) 贪心算法C++代码如下: @@ -29,12 +60,17 @@ public: int result = 0; int minPrice = prices[0]; // 记录最低价格 for (int i = 1; i < prices.size(); i++) { - // 买入 - if (prices[i] < minPrice) minPrice = prices[i]; // 情况二 + // 情况二:相当于买入 + if (prices[i] < minPrice) minPrice = prices[i]; + + // 情况三:保持原有状态(因为此时买则不便宜,卖则亏本) + if (prices[i] >= minPrice && prices[i] <= minPrice + fee) { + continue; + } // 计算利润,可能有多次计算利润,最后一次计算利润才是真正意义的卖出 if (prices[i] > minPrice + fee) { - result += prices[i] - minPrice - fee; + result += prices[i] - minPrice - fee; minPrice = prices[i] - fee; // 情况一,这一步很关键 } } @@ -43,14 +79,16 @@ public: }; ``` -从代码中可以看出对情况一的操作,因为如果还在收获利润的区间里,表示并不是真正的卖出,而计算利润每次都要减去手续费, -**所以要让minPrice = prices[i] - fee;,这样在明天收获利润的时候,才不会多减一次手续费!** +* 时间复杂度:O(n) +* 空间复杂度:O(1) -理解这里很关键,其实也是核心所在,很多题解关于这块都没有说清楚。 +从代码中可以看出对情况一的操作,因为如果还在收获利润的区间里,表示并不是真正的卖出,而计算利润每次都要减去手续费,**所以要让minPrice = prices[i] - fee;,这样在明天收获利润的时候,才不会多减一次手续费!** + +大家也可以发现,情况三,那块代码是可以删掉的,我是为了让代码表达清晰,所以没有精简。 ## 动态规划 -我在「代码随想录」公众号里正在讲解贪心算法,将在下一个系列详细讲解动态规划,所以本题解先给出我的C++代码(带详细注释),感兴趣的同学可以自己先学习一下。 +我在公众号「代码随想录」里将在下一个系列详细讲解动态规划,所以本题解先给出我的C++代码(带详细注释),感兴趣的同学可以自己先学习一下。 相对于[贪心算法:122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/VsTFA6U96l18Wntjcg3fcg)的动态规划解法中,只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的。 @@ -66,9 +104,7 @@ public: vector> dp(n, vector(2, 0)); dp[0][0] -= prices[0]; // 持股票 for (int i = 1; i < n; i++) { - // 第i天持股票所剩最多现金 = max(第i-1天持股票所剩现金, 第i-1天持现金-买第i天的股票) dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]); - // 第i天持有最多现金 = max(第i-1天持有的最多现金,第i-1天持有股票所剩的最多现金+第i天卖出股票-手续费) dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee); } return max(dp[n - 1][0], dp[n - 1][1]); @@ -76,6 +112,9 @@ public: }; ``` +* 时间复杂度:O(n) +* 空间复杂度:O(n) + 当然可以对空间经行优化,因为当前状态只是依赖前一个状态。 C++ 代码如下: @@ -96,7 +135,16 @@ public: } }; ``` +* 时间复杂度:O(n) +* 空间复杂度:O(1) + +# 总结 + +本题贪心的思路其实是比较难的,动态规划才是常规做法,但也算是给大家拓展一下思路,感受一下贪心的魅力。 + +后期我们在讲解 股票问题系列的时候,会用动规的方式把股票问题穿个线。 + +就酱,学算法,认准「代码随想录」,值得推荐给身边的朋友同学们! -细心的同学可能发现,在计算saleStock的时候 使用的已经是最新的holdStock了,理论上应该使用上一个状态的holdStock即(i-1时候的holdstock),但是 diff --git a/problems/0738.单调递增的数字.md b/problems/0738.单调递增的数字.md index dd228772..66e46bc0 100644 --- a/problems/0738.单调递增的数字.md +++ b/problems/0738.单调递增的数字.md @@ -1,10 +1,33 @@ +> + +# 738.单调递增的数字 + +给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。 + +(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。) + +示例 1: +输入: N = 10 +输出: 9 + +示例 2: +输入: N = 1234 +输出: 1234 + +示例 3: +输入: N = 332 +输出: 299 + +说明: N 是在 [0, 10^9] 范围内的一个整数。 + # 思路 ## 暴力解法 -暴力一波 果然超时了 +题意很简单,那么首先想的就是暴力解法了,来我提大家暴力一波,结果自然是超时! +代码如下: ```C++ class Solution { private: @@ -27,6 +50,9 @@ public: } }; ``` +* 时间复杂度:O(n * m) m为n的数字长度 +* 空间复杂度:O(1) + ## 贪心算法 题目要求小于等于N的最大单调递增的整数,那么拿一个两位的数字来举例。 @@ -43,12 +69,13 @@ public: 此时是从前向后遍历还是从后向前遍历呢? -这里其实还有一个贪心选择,对于“遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]--,然后strNum[i]给为9”的情况,这个strNum[i - 1]--的操作应该是越靠后越好。 +从前向后遍历的话,遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]减一,但此时如果strNum[i - 1]减一了,可能又小于strNum[i - 2]。 -因为这样才能让这个单调递增整数尽可能的大。例如:对于5486,第一位的5能不减一尽量不减一,因为这个减一对整体损失最大。 +这么说有点抽象,举个例子,数字:332,从前向后遍历的话,那么就把变成了329,此时2又小于了第一位的3了,真正的结果应该是299。 -所以要从后向前遍历,遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]--,然后strNum[i]给为9,这样保证这个减一的操作尽可能在后面进行(即整数的尽可能小的位数上进行)。 +**所以从前后向遍历会改变已经遍历过的结果!** +那么从后向前遍历,就可以重复利用上次比较得出的结果了,从后向前遍历332的数值变化为:332 -> 329 -> 299 确定了遍历顺序之后,那么此时局部最优就可以推出全局,找不出反例,试试贪心。 @@ -76,6 +103,20 @@ public: }; ``` + +* 时间复杂度:O(n) n 为数字长度 +* 空间复杂度:O(n) 需要一个字符串,转化为字符串操作更方便 + +# 总结 + +本题只要想清楚个例,例如98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]减一,strNum[i]赋值9,这样这个整数就是89。就可以很自然想到对应的贪心解法了。 + +想到了贪心,还要考虑遍历顺序,只有从后向前遍历才能重复利用上次比较的结果。 + +最后代码实现的时候,也需要一些技巧,例如用一个flag来标记从哪里开始赋值9。 + +就酱,循序渐进学算法,认准「代码随想录」! + > **我是[程序员Carl](https://github.com/youngyangyang04),可以找我[组队刷题](https://img-blog.csdnimg.cn/20201115103410182.png),也可以在[B站上找到我](https://space.bilibili.com/525438321),本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在公众号:[代码随想录](https://img-blog.csdnimg.cn/20201124161234338.png),关注后就会发现和「代码随想录」相见恨晚!** **如果感觉题解对你有帮助,不要吝啬给一个👍吧!**