The Indian Engineer

Problem 121 Best Time to Buy and Sell Stock

Posted on 2 mins

Dp Dynamic-Programming Array

Problem Statement

Link - Problem 121

Question

You are given an array prices where prices[i] is the price of a given stock on the ith day.

You want to maximize your profit by choosing a single day to buy one stock and choosing a different day in the future to sell that stock.

Return the maximum profit you can achieve from this transaction. If you cannot achieve any profit, return 0.

Example 1

Input: prices = [7,1,5,3,6,4]
Output: 5
Explanation: Buy on day 2 (price = 1) and sell on day 5 (price = 6),
profit = 6-1 = 5.
Note that buying on day 2 and selling on day 1 is not allowed ,
because you must buy before you sell.

Example 2

Input: prices = [7,6,4,3,1]
Output: 0
Explanation: In this case, no transactions are done and the max profit = 0.

Constraints

Solution

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        std::ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int n = prices.size();
        int buyAtPrice = INT_MAX;
        int maxProfit = 0;
        for(int i=0; i<n; i++){
            buyAtPrice = min(buyAtPrice, prices[i]);
            maxProfit = max(maxProfit, prices[i] - buyAtPrice);
        }
        return maxProfit;
    }
};

Complexity Analysis

| Algorithm | Time Complexity | Space Complexity |
| --------- | --------------- | ---------------- |
| Dp        | O(n)            | O(1)             |

Explanation

1. Intuition

2. Implementation

- Initialize two variables `buyAtPrice` and `maxProfit` to `INT_MAX` and `0` respectively.
- For every `price` in `prices`:
  - Update `buyAtPrice` to the minimum of `buyAtPrice` and `price`.
  - Update `maxProfit` to the maximum of `maxProfit` and `price - buyAtPrice`.
- Return `maxProfit`.

There are various follow ups, do check it out in leetcode.