题目链接
解题思路
- 贪心法
- 由于股票的购买没有限制,因此整个问题等价于寻找
x
个不相交的区间 ( l i , r i ) (l_i,r_i) (li,ri)使得如下的等式最大化 ∑ i = 1 x a [ r i ] − a [ l i ] \sum_{i=1}^{x}{a[r_i]-a[l_i]} ∑i=1xa[ri]−a[li].其中 l i l_i li表示在第 l i l_i li天买入, r i r_i ri表示在第 r i r_i ri天卖出。 - 对于区间
(
l
i
,
r
i
)
(l_i,r_i)
(li,ri)这一区间贡献的价值为
a
[
r
i
]
−
a
[
l
i
]
a[r_i]-a[l_i]
a[ri]−a[li]。而
a
[
r
i
]
−
a
[
l
i
]
=
(
a
[
r
i
]
−
a
[
r
i
−
1
]
)
+
(
a
[
r
i
−
1
]
−
a
[
r
i
−
2
]
)
+
.
.
.
+
(
a
[
l
i
+
1
]
−
a
[
l
i
]
)
a[r_i]-a[l_i]=(a[r_i]-a[r_i-1])+(a[r_i-1]-a[r_i-2])+...+(a[l_i+1]-a[l_i])
a[ri]−a[li]=(a[ri]−a[ri−1])+(a[ri−1]−a[ri−2])+...+(a[li+1]−a[li]).因此问题可以简化为寻找
x
个长度为1
的区间 ( l i , l i + 1 ) (l_i,l_i+1) (li,li+1),使得 ∑ i = 1 x a [ r i ] − a [ l i ] \sum_{i=1}^{x}{a[r_i]-a[l_i]} ∑i=1xa[ri]−a[li]最大 - 因此最后的答案是 a n s = ∑ i = 1 n − 1 m a x ( 0 , a [ i ] − a [ i − 1 ] ) ans = \sum_{i=1}^{n-1}max{(0,a[i]-a[i-1])} ans=∑i=1n−1max(0,a[i]−a[i−1])
AC代码
class Solution {
public int maxProfit(int[] prices) {
int ans = 0;
int len = prices.length;
for (int i = 1; i < len; i++)
ans += Math.max(0, prices[i] - prices[i - 1]);
return ans;
}
}
本地测试代码
package com.company;
public class Solution_122 {
public static int maxProfit(int[] prices) {
int ans = 0;
int len = prices.length;
for (int i = 1; i < len; i++)
ans += Math.max(0, prices[i] - prices[i - 1]);
return ans;
}
public static void main(String[] args) {
System.out.println(maxProfit(new int[]{7, 1, 5, 3, 6, 4}));
System.out.println(maxProfit(new int[]{1, 2, 3, 4, 5}));
}
}