通过两层循环来尝试所有可能的买入和卖出日期组合,并计算每种组合的利润,然后找出最大的利润。第 1 天买可在未来
n
−
1
n-1
n−1天卖出,第 2 天买可在未来
n
−
2
n-2
n−2天卖出……以此类推。
循环了
(
n
−
1
)
+
(
n
−
2
)
+
.
.
.
+
0
=
n
(
n
−
1
)
2
(n-1)+(n-2)+...+0=\frac{n(n-1)}{2}
(n−1)+(n−2)+...+0=2n(n−1),时间复杂度为
O
(
n
2
)
O(n^2)
O(n2),空间复杂度为
O
(
1
)
O(1)
O(1)
代码
publicintmaxProfit(int[] prices){if(prices ==null|| prices.length <=1){return0;}int maxProfit =0;// 外层循环遍历所有可能的买入日期 for(int i =0; i < prices.length -1; i++){// 内层循环遍历所有可能的卖出日期(在买入日期之后) for(int j = i +1; j < prices.length; j++){// 计算当前买入卖出组合的利润 int profit = prices[j]- prices[i];// 如果利润大于当前最大利润,则更新最大利润 if(profit > maxProfit){
maxProfit = profit;}}}return maxProfit;}
解法二:一次遍历
如果第
i
i
i天卖出股票,则最大利润为(该天的股价-前面天数中最小的股价),然后与已知的最大利润比较,如果大于则更新当前最大利润的值。
遍历数组
p
r
i
c
e
s
prices
prices,我们可以同时记录到目前为止所看到的最低价格
m
i
n
P
r
i
c
e
minPrice
minPrice和最大利润
m
a
x
P
r
o
f
i
t
maxProfit
maxProfit。对于每一天的价格
p
r
i
c
e
s
[
i
]
prices[i]
prices[i],更新
m
i
n
P
r
i
c
e
minPrice
minPrice(如果它更低的话),并计算如果在这一天卖出股票所能获得的利润。如果这个利润大于我们目前所知的
m
a
x
P
r
o
f
i
t
maxProfit
maxProfit,则更新
m
a
x
P
r
o
f
i
t
maxProfit
maxProfit。