Skip to content

Commit 307e847

Browse files
committed
add LeetCode 121. 买卖股票的最佳时机
1 parent bc23cdb commit 307e847

File tree

1 file changed

+115
-0
lines changed

1 file changed

+115
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL2Nob2NvbGF0ZTE5OTkvY2RuL2ltZy8yMDIwMDgyODE0NTUyMS5qcGc?x-oss-process=image/format,png)
2+
>仰望星空的人,不应该被嘲笑
3+
4+
## 题目描述
5+
6+
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
7+
8+
如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
9+
10+
注意:你不能在买入股票前卖出股票。
11+
12+
13+
14+
示例 1:
15+
16+
```javascript
17+
输入: [7,1,5,3,6,4]
18+
输出: 5
19+
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
20+
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
21+
```
22+
23+
示例 2:
24+
25+
```javascript
26+
输入: [7,6,4,3,1]
27+
输出: 0
28+
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
29+
```
30+
31+
来源:力扣(LeetCode)
32+
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock
33+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
34+
35+
## 解题思路
36+
这道题想了挺久,参考了大佬的题解,典型的二维 dp 问题。
37+
38+
状态 `dp[i][j] `表示:在下标为 `i` 的这一天,用户手上持股状态为 `j` 所获得的最大利润。
39+
40+
说明:
41+
42+
- `j` 只有 2 个值:0 表示不持股(特指卖出股票以后的不持股状态),1 表示持股。
43+
- 「用户手上不持股」不代表用户一定在下标为 `i` 的这一天把股票抛售了;
44+
45+
`dp[i][0] `怎样转移?
46+
47+
对于当前这天,不持股份的话,当然可以是前一天也没有持股份,即 `dp[i-1][0]`
48+
还有可能就是昨天持股了,我今天把这股份卖了,那么就要加上今天卖的那份股份值,即 `dp[i-1][1] + prices[i]`
49+
50+
综上,得到状态方程:
51+
52+
```javascript
53+
dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] + prices[i]);
54+
```
55+
56+
`dp[i][1]` 怎样转移?
57+
58+
对于当前这天,如果持了股份的话,当天可以是前一天也持了股份,即 `dp[i-1][1]`
59+
还有可能就是我今天才持股,同时注意,我们不能加上 `dp[i-1][0]`,因为我们只能**交易一次**,即从当前这天持股,那么买入带来的收益即为 `-prices[i]`
60+
61+
综上,得到状态方程:
62+
63+
```javascript
64+
dp[i][1] = Math.max(dp[i-1][1], -prices[i]);
65+
```
66+
67+
68+
69+
```javascript
70+
/**
71+
* @param {number[]} prices
72+
* @return {number}
73+
*/
74+
var maxProfit = function(prices) {
75+
let n = prices.length;
76+
if(n<2) return 0; // 不足两天,肯定没收益
77+
let dp = new Array(n);
78+
for(let i=0;i<n;i++){
79+
dp[i] = new Array(2);
80+
}
81+
dp[0][0] = 0; // 第一天不持股
82+
dp[0][1] = -prices[0]; // 第一天持股,即买入
83+
for(let i=1;i<n;i++){
84+
dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] + prices[i]);
85+
dp[i][1] = Math.max(dp[i-1][1], -prices[i]);
86+
}
87+
return dp[n-1][0]; // 最大收益,最后一天卖出股票的结果
88+
};
89+
```
90+
91+
92+
93+
94+
95+
## 最后
96+
文章产出不易,还望各位小伙伴们支持一波!
97+
98+
往期精选:
99+
100+
<a href="https://github.com/Chocolate1999/Front-end-learning-to-organize-notes">小狮子前端の笔记仓库</a>
101+
102+
<a href="https://github.com/Chocolate1999/leetcode-javascript">leetcode-javascript:LeetCode 力扣的 JavaScript 解题仓库,前端刷题路线(思维导图)</a>
103+
104+
小伙伴们可以在Issues中提交自己的解题代码,🤝 欢迎Contributing,可打卡刷题,Give a ⭐️ if this project helped you!
105+
106+
107+
<a href="https://yangchaoyi.vip/">访问超逸の博客</a>,方便小伙伴阅读玩耍~
108+
109+
![](https://img-blog.csdnimg.cn/2020090211491121.png#pic_center)
110+
111+
```javascript
112+
学如逆水行舟,不进则退
113+
```
114+
115+

0 commit comments

Comments
 (0)