Problem Description
You are given an integer array prices where prices[i] is the price of a given stock on the ith day.
On each day, you may decide to buy and/or sell the stock. You can only hold at most one share of the stock at any time. However, you can buy it then immediately sell it on the same day.
Find and return the maximum profit you can achieve.
Examples
Example 1: Input: prices = [7,1,5,3,6,4] Output: 7 Explanation: Buy on day 2 (price = 1) and sell on day 3 (price = 5), profit = 5-1 = 4. Then buy on day 4 (price = 3) and sell on day 5 (price = 6), profit = 6-3 = 3. Total profit is 4 + 3 = 7. Example 2: Input: prices = [1,2,3,4,5] Output: 4 Explanation: Buy on day 1 (price = 1) and sell on day 5 (price = 5), profit = 5-1 = 4. Total profit is 4. Example 3: Input: prices = [7,6,4,3,1] Output: 0 Explanation: No transactions are done and the max profit = 0.
Python Solution
def maxProfit(prices: List[int]) -> int:
profit = 0
# Iterate through the array starting from second element
for i in range(1, len(prices)):
# If current price is higher than previous price
# we can make profit by buying yesterday and selling today
if prices[i] > prices[i-1]:
profit += prices[i] - prices[i-1]
return profit
Java Solution
class Solution {
public int maxProfit(int[] prices) {
int profit = 0;
// Iterate through the array starting from second element
for (int i = 1; i < prices.length; i++) {
// If current price is higher than previous price
// we can make profit by buying yesterday and selling today
if (prices[i] > prices[i-1]) {
profit += prices[i] - prices[i-1];
}
}
return profit;
}
}
C++ Solution
class Solution {
public:
int maxProfit(vector& prices) {
int profit = 0;
// Iterate through the array starting from second element
for (int i = 1; i < prices.size(); i++) {
// If current price is higher than previous price
// we can make profit by buying yesterday and selling today
if (prices[i] > prices[i-1]) {
profit += prices[i] - prices[i-1];
}
}
return profit;
}
};
JavaScript Solution
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function(prices) {
let profit = 0;
// Iterate through the array starting from second element
for (let i = 1; i < prices.length; i++) {
// If current price is higher than previous price
// we can make profit by buying yesterday and selling today
if (prices[i] > prices[i-1]) {
profit += prices[i] - prices[i-1];
}
}
return profit;
};
C# Solution
public class Solution {
public int MaxProfit(int[] prices) {
int profit = 0;
// Iterate through the array starting from second element
for (int i = 1; i < prices.Length; i++) {
// If current price is higher than previous price
// we can make profit by buying yesterday and selling today
if (prices[i] > prices[i-1]) {
profit += prices[i] - prices[i-1];
}
}
return profit;
}
}
Complexity Analysis
- Time Complexity: O(n) where n is the length of the prices array
- Space Complexity: O(1) as we only use a single variable
Solution Explanation
This solution uses a greedy approach:
- Key concept:
- Valley-peak approach
- Capture all profits
- Local optimization
- Algorithm steps:
- Track total profit
- Compare adjacent prices
- Add positive differences
- Return total profit
Key points:
- Simple one-pass
- No need to track buy/sell days
- Captures all profits
- Handles all cases