Best Day to Buy and Sell a Stock

easy array greedy

Problem

An array lists the daily price of one share of a stock in chronological order. Choose a day to buy and a strictly later day to sell. Return the largest profit you can earn. If no positive profit is possible, return 0.

Inputprices = [8, 3, 6, 4, 9, 5]
Output6
Buy on day 1 at price 3, sell on day 4 at price 9. Profit = 9 − 3 = 6.

def best_profit(prices):
    min_so_far = float("inf")
    best = 0
    for p in prices:
        if p < min_so_far:
            min_so_far = p
        if p - min_so_far > best:
            best = p - min_so_far
    return best
function bestProfit(prices) {
  let minSoFar = Infinity;
  let best = 0;
  for (let i = 0; i < prices.length; i++) {
    if (prices[i] < minSoFar) minSoFar = prices[i];
    const profit = prices[i] - minSoFar;
    if (profit > best) best = profit;
  }
  return best;
}
class Solution {
    public int bestProfit(int[] prices) {
        int minSoFar = Integer.MAX_VALUE;
        int best = 0;
        for (int p : prices) {
            if (p < minSoFar) minSoFar = p;
            if (p - minSoFar > best) best = p - minSoFar;
        }
        return best;
    }
}
int bestProfit(vector<int>& prices) {
    int minSoFar = INT_MAX, best = 0;
    for (int p : prices) {
        if (p < minSoFar) minSoFar = p;
        if (p - minSoFar > best) best = p - minSoFar;
    }
    return best;
}
Time: O(n) Space: O(1)