题目概述:
题目链接:点我做题
一、贪心算法
不妨这样思考,最高的总收益值由以下集合的中的最大值决定:
{
x
∣
x
=
第
i
天
抛
售
股
票
能
带
来
的
最
大
收
益
值
}
\left\{ x|x = 第i天抛售股票能带来的最大收益值 \right\}
{x∣x=第i天抛售股票能带来的最大收益值}
那第i天抛售股票能带来的最大收益值怎么计算呢?可以由以下公式计算:
第
i
天
抛
售
股
票
能
带
来
的
最
大
收
益
值
=
当
天
的
股
票
价
格
−
到
第
i
天
为
止
(
包
括
第
i
天
)
最
低
的
股
票
价
格
(
作
为
买
入
价
格
)
第i天抛售股票能带来的最大收益值 \\=当天的股票价格-\\到第i天为止(包括第i天)最低的股票价格(作为买入价格)
第i天抛售股票能带来的最大收益值=当天的股票价格−到第i天为止(包括第i天)最低的股票价格(作为买入价格)
我们定义
m
i
n
i
p
r
i
c
e
miniprice
miniprice表示到到第i天为止(包括第i天)最低的股票价格,定义
m
a
x
p
r
o
f
i
t
maxprofit
maxprofit作为随着循环不断更新最大值的最大收益值,定义
c
u
r
p
r
o
f
i
t
curprofit
curprofit作为第i天抛售股票能带来的最大收益值,显然可以在同一趟循环中先更新
m
i
n
i
p
r
i
c
e
miniprice
miniprice(用之前的
m
i
n
i
p
r
i
c
e
miniprice
miniprice和今日的价格对比),再计算
c
u
r
p
r
o
f
i
t
curprofit
curprofit(用当日的价格
p
r
i
c
e
s
[
i
]
−
m
i
n
i
p
r
i
c
e
prices[i]-miniprice
prices[i]−miniprice),再更新
m
a
x
p
r
o
f
i
t
maxprofit
maxprofit(用
c
u
r
p
r
o
f
i
t
curprofit
curprofit和第i-1天的
m
a
x
p
r
o
f
i
t
maxprofit
maxprofit取大),最后循环结束,返回
m
a
x
p
r
o
f
i
t
maxprofit
maxprofit。
巧妙的是,如果当天就是股票最低值,就会使得当天抛售的最大利润
c
u
r
p
r
o
f
i
t
curprofit
curprofit就是0,与我们的题意不谋而合。
代码:
class Solution {
public:
int maxProfit(vector<int>& prices)
{
int len = prices.size();
if (len == 1)
{
return 0;
}
int maxprofit = 0;
int curprofit = 0;
int miniprice = INT_MAX;
for (int i = 0; i < len; i++)
{
if (prices[i] < miniprice)
{
miniprice = prices[i];
}
curprofit = prices[i] - miniprice;
if (curprofit > maxprofit)
{
maxprofit = curprofit;
}
}
return maxprofit;
}
};
时间复杂度:
O
(
N
)
O(N)
O(N)
空间复杂度:
O
(
1
)
O(1)
O(1)