Buy and Sell Stocks All Variants in DSA Typescript - Time & Space Complexity
When solving buy and sell stock problems, we want to know how the time needed grows as the number of days increases.
We ask: How does the number of price checks and decisions change when we have more days?
Analyze the time complexity of the following code snippet.
function maxProfit(prices: number[]): number {
let minPrice = Infinity;
let maxProfit = 0;
for (const price of prices) {
if (price < minPrice) minPrice = price;
else if (price - minPrice > maxProfit) maxProfit = price - minPrice;
}
return maxProfit;
}
This code finds the best profit from buying and selling once by checking each day's price.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: One loop through the prices array.
- How many times: Exactly once for each day (n times).
As the number of days increases, the code checks each price once.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 checks |
| 100 | 100 checks |
| 1000 | 1000 checks |
Pattern observation: The work grows directly with the number of days.
Time Complexity: O(n)
This means the time needed grows in a straight line with the number of days.
[X] Wrong: "Checking every pair of days is needed to find max profit."
[OK] Correct: The code smartly tracks the lowest price so far and only compares current price to it, avoiding extra checks.
Understanding this time complexity shows you can write efficient code that scales well, a key skill interviewers look for.
"What if we allowed unlimited transactions instead of just one? How would the time complexity change?"
Practice
Buy and Sell Stocks problem with only one transaction allowed?Solution
Step 1: Understand the problem goal
The problem asks to find the maximum profit by buying and selling once, so we want the biggest positive difference between a sell price after a buy price.Step 2: Identify the correct approach
Maximizing the difference between a later selling price and an earlier buying price directly solves the problem.Final Answer:
Maximize the difference between a later selling price and an earlier buying price -> Option AQuick Check:
Goal = Maximize profit from one buy and one sell [OK]
- Thinking to minimize transactions instead of maximizing profit
- Confusing lowest price with max profit
- Ignoring the order of buy before sell
Solution
Step 1: Analyze the input and output types
The input should be an array of numbers representing prices, soprices: number[]. The output is the maximum profit, a number.Step 2: Match the correct function signature
function maxProfit(prices: number[]): number matches input as number array and output as number, which is correct.Final Answer:
function maxProfit(prices: number[]): number -> Option AQuick Check:
Input array, output number [OK]
- Using string type for prices
- Returning array instead of number
- Using void return type
function maxProfit(prices: number[]): number {
let profit = 0;
for (let i = 1; i < prices.length; i++) {
if (prices[i] > prices[i - 1]) {
profit += prices[i] - prices[i - 1];
}
}
return profit;
}
console.log(maxProfit([7,1,5,3,6,4]));Solution
Step 1: Trace the loop and calculate profit increments
Prices: [7,1,5,3,6,4] - i=1: 1 > 7? No, profit=0 - i=2: 5 > 1? Yes, profit += 5-1=4 - i=3: 3 > 5? No, profit=4 - i=4: 6 > 3? Yes, profit += 6-3=3, total=7 - i=5: 4 > 6? No, profit=7Step 2: Return total profit
Total profit after loop is 7.Final Answer:
7 -> Option BQuick Check:
Sum of positive diffs = 7 [OK]
- Adding negative differences
- Only considering one transaction
- Misreading array indices
function maxProfit(prices: number[]): number {
let minPrice = prices[0];
let maxProfit = 0;
for (let i = 1; i <= prices.length; i++) {
if (prices[i] < minPrice) {
minPrice = prices[i];
} else if (prices[i] - minPrice > maxProfit) {
maxProfit = prices[i] - minPrice;
}
}
return maxProfit;
}Solution
Step 1: Check loop boundary
The loop runs with i from 1 to prices.length inclusive, but array indices go from 0 to prices.length - 1. Using <= causes out-of-bounds access at prices[prices.length].Step 2: Correct the loop condition
Change loop condition to i < prices.length to avoid accessing undefined elements.Final Answer:
Loop condition should be < instead of <= -> Option DQuick Check:
Array index out-of-bounds fixed by < condition [OK]
- Using <= causing runtime errors
- Initializing minPrice incorrectly
- Sorting prices unnecessarily
[3, 3, 5, 0, 0, 3, 1, 4], what is the maximum profit with at most two transactions?Solution
Step 1: Understand two transactions limit
We can buy and sell at most twice. We want to split the array into two parts and maximize profit from each.Step 2: Calculate max profit for each split
Best first transaction: buy at 3, sell at 5 = 2 profit Best second transaction: buy at 0, sell at 4 = 4 profit Total max profit = 2 + 4 = 6Step 3: Check for better splits
Splitting at index 5: first part max profit = 4 (buy at 0 sell at 3), second part max profit = 3 (buy at 1 sell at 4), total = 7Final Answer:
7 -> Option CQuick Check:
Sum of two best transactions = 7 [OK]
- Counting more than two transactions
- Not splitting array correctly
- Choosing wrong buy/sell days
Ready to prove it?
Pass the test and this pattern moves unknown
