Say you have an array for which the ith element 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 (ie, buy one and sell one share of the stock multiple times). However, you may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
Analysis
This problem can be viewed as finding all ascending sequences. For example, given {5, 1, 2, 3, 4}, buy at 1 & sell at 4 is the same as buy at 1 &sell at 2 & buy at 2& sell at 3 & buy at 3 & sell at 4.
We can scan the array once, and find all pairs of elements that are in ascending order.
Java Solution
public int maxProfit(int[] prices) { int profit = 0; for(int i=1; i<prices.length; i++){ int diff = prices[i]-prices[i-1]; if(diff > 0){ profit += diff; } } return profit; } |
The answer is 7 and you said it yourself: (5-1) + (7-4).
It returns 50. (41-12) + (54-41) + (20-12). Not sure if this is still a question for you.
12,41,54,12,20
This input returns 42 as the answer. Shouldn’t it be 50?
54-12 = 42
20-12 = 8
so 42+8 = 50??
7 is the correct answer. You can buy at 5 instead 4 on second step, but why?
The above code doesn’t take care of this case stockPrices = {1,5,4,7}, above code would return 7 ((5-1) + (7-4)), instead of ((5-1) + (7-5)) = 6… Stock has to be bought before being sold… So the code below keeps track of the price stock was bought at..
public int maxProfit(int[] prices) {
int profit = 0;
// to keep track of when the stock was bought
int boughtAt = stockPrices[0];
for (int i = 1; i 0) { // profit
// update stock bought at
boughtAt = stockPrices[i];
// update profit
profit += diff;
}
}
}