122 Best Time to Buy and Sell Stock II

# 1. Question

Say you have an array for which thei_thelement is the price of a given stock on day_i.
Design an algorithm to find the maximum profit. You may complete as many transactions as you like (i.e., buy one and sell one share of the stock multiple times).
Note:You may not engage in multiple transactions at the same time (i.e., you must sell the stock before you buy again).
Example 1:
1
Input: [7,1,5,3,6,4]
2
3
Output: 7
4
5
Explanation:
6
Buy on day 2 (price = 1) and sell on day 3 (price = 5), profit = 5-1 = 4.
7
Then buy on day 4 (price = 3) and sell on day 5 (price = 6), profit = 6-3 = 3.
Copied!
Example 2:
1
Input: [1,2,3,4,5]
2
3
Output: 4
4
5
Explanation:
6
Buy on day 1 (price = 1) and sell on day 5 (price = 5), profit = 5-1 = 4.
7
Note that you cannot buy on day 1, buy on day 2 and sell them later, as you are
8
engaging multiple transactions at the same time. You must sell before buying again.
Copied!
Example 3:
1
Input:
2
[7,6,4,3,1]
3
4
Output:
5
0
6
7
Explanation:
8
In this case, no transaction is done, i.e. max profit = 0.
Copied!

# 2. Implementation

(1) Greedy
1
class Solution {
2
public int maxProfit(int[] prices) {
3
if (prices == null || prices.length == 0) {
4
return 0;
5
}
6
7
int max = 0;
8
int curMax = 0;
9
10
for (int i = 1; i < prices.length; i++) {
11
curMax = prices[i] > prices[i - 1] ? curMax + prices[i] - prices[i - 1] : curMax;
12
max = Math.max(max, curMax);
13
}
14
return max;
15
}
16
}
Copied!
(2) DP
1
class Solution {
2
public int maxProfit(int[] prices) {
3
if (prices == null || prices.length == 0) {
4
return 0;
5
}
6
7
int n = prices.length;
8
int[] profits = new int[n];
9
10
for (int i = 1; i < n; i++) {
11
profits[i] = prices[i] > prices[i - 1] ? profits[i - 1] + prices[i] - prices[i - 1] : profits[i - 1];
12
}
13
return profits[n - 1];
14
}
15
}
Copied!

# 3. Time & Space Complexity

Greedy: 时间复杂度O(n), 空间复杂度O(1)
Dynamic Programming: 时间复杂度O(n), 空间复杂度O(n)