121. Best Time to Buy and Sell Stock
easyAsked at AtlassianBest Time to Buy and Sell Stock is an Atlassian warm-up that tests whether you notice the linear single-pass pattern. Given an array of daily prices, return the maximum profit from one buy then one sell. The trap is brute-forcing every (buy, sell) pair when one pass suffices.
By Sam K., Founder, InterviewChamp.AI · Last verified
Source citations
Public interview reports confirming this problem appears in Atlassian loops.
- Glassdoor (2026-Q1)— Atlassian SWE-I phone-screen reports cite Best Time to Buy/Sell Stock as a recurring warm-up.
- Blind (2025-12)— Atlassian interview threads list this as a 10-minute opener before the harder DP variants (II, III, IV).
Problem
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.
Constraints
1 <= prices.length <= 10^50 <= prices[i] <= 10^4
Examples
Example 1
prices = [7,1,5,3,6,4]5Explanation: Buy on day 2 (price=1) and sell on day 5 (price=6), profit=5.
Example 2
prices = [7,6,4,3,1]0Explanation: Prices strictly decreasing; no transaction is profitable.
Approaches
1. Brute O(n^2)
For every (i, j) with i < j, track max(prices[j] - prices[i]).
- Time
- O(n^2)
- Space
- O(1)
function maxProfitBrute(prices) {
let max = 0;
for (let i = 0; i < prices.length; i++) {
for (let j = i + 1; j < prices.length; j++) {
const profit = prices[j] - prices[i];
if (profit > max) max = profit;
}
}
return max;
}Tradeoff: Times out at n=10^5 (10^10 ops). Useful only to motivate the single pass.
2. Single-pass running minimum (optimal)
Walk left-to-right tracking the minimum price seen so far. At each price, candidate profit = price - minSoFar. Track max candidate.
- Time
- O(n)
- Space
- O(1)
function maxProfit(prices) {
let min = prices[0];
let max = 0;
for (let i = 1; i < prices.length; i++) {
if (prices[i] < min) min = prices[i];
else if (prices[i] - min > max) max = prices[i] - min;
}
return max;
}Tradeoff: The Atlassian-canonical answer. The if/else (instead of two separate ifs) is the micro-optimization to mention: if today's price is a new min, no candidate profit can be computed today, so skip the second comparison.
Atlassian-specific tips
Atlassian uses this as a 10-minute opener. State the pattern out loud: 'I'll track the minimum price seen so far and at each day compute the candidate profit if I sold today.' Then write. After you finish, expect 'now what if you could do multiple buy/sells?' (LeetCode 122) or 'at most 2 transactions' (LeetCode 123). Don't get stuck explaining the simple version — they're just clearing throat before the real DP problem.
Common mistakes
- Initializing max to prices[0] - prices[0] = 0 but starting the loop at i=0 — you compare prices[0] - prices[0] = 0 which is harmless but indicates muddled control flow. Start at i=1.
- Returning prices[end] - prices[start] when start > end means buying after selling — must enforce i < j.
- Forgetting to return 0 when prices is strictly decreasing — the algorithm handles it (max stays 0), but candidates sometimes return a negative number.
Follow-up questions
An interviewer at Atlassian may pivot to one of these next:
- Best Time to Buy and Sell Stock II (LeetCode 122) — unlimited transactions; sum positive day-to-day deltas.
- Best Time to Buy and Sell Stock III (LeetCode 123) — at most 2 transactions; DP with forward + backward arrays.
- Best Time with cooldown / transaction fee — classic state-machine DP.
Solve it now
Free. No sign-up. Python and JavaScript run instantly in your browser.
FAQ
Is this DP?
It's the simplest case of stock-DP. Tracking minSoFar IS the state (cost of best buy so far). The 'real' DP framing helps when you generalize to 2+ transactions; for this problem the linear scan is the natural fit.
Does Atlassian still ask this?
Yes as a SWE-I phone-screen opener. Almost never standalone at SWE-II+; expect a follow-up to one of the harder variants in those rounds.
Free learning resources
Curated free links for this problem.