121. Best Time to Buy and Sell Stock

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:

• `1 <= prices.length <= 10^5`
• `0 <= prices[i] <= 10^4`

解法解析

程式範例

Go
``````func maxProfit(prices []int) int {
minPrice := math.MaxInt32
theMaxProfit := 0
for _, price := range prices {
if price < minPrice {
minPrice = price
} else if price-minPrice > theMaxProfit {
theMaxProfit = price - minPrice
}
}

return theMaxProfit
}
``````
JavaScript
``````/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function (prices) {
let minPrice = Number.MAX_SAFE_INTEGER,
theMaxProfit = 0;
for (let price of prices) {
if (price < minPrice) {
minPrice = price;
} else if (price - minPrice > theMaxProfit) {
theMaxProfit = price - minPrice;
}
}

return theMaxProfit;
};
``````
Kotlin
``````class Solution {
fun maxProfit(prices: IntArray): Int {
var minPrice = Int.MAX_VALUE
var theMaxProfit = 0

for (price in prices) {
if (price < minPrice) {
minPrice = price
} else if (price - minPrice > theMaxProfit) {
theMaxProfit = price - minPrice
}
}

return theMaxProfit
}
}
``````
PHP
``````class Solution
{

/**
* @param Integer[] \$prices
* @return Integer
*/
function maxProfit(\$prices)
{
\$minPrice = PHP_INT_MAX;
\$maxProfit = 0;

foreach (\$prices as \$price) {
if (\$price < \$minPrice) {
\$minPrice = \$price;
} elseif (\$price - \$minPrice > \$maxProfit) {
\$maxProfit = \$price - \$minPrice;
}
}

return \$maxProfit;
}
}
``````
Python
``````class Solution:
def maxProfit(self, prices: List[int]) -> int:
min_price = float('inf')
max_profit = 0
for i in range(len(prices)):
if prices[i] < min_price:
min_price = prices[i]
elif prices[i] - min_price > max_profit:
max_profit = prices[i] - min_price

return max_profit
``````
Rust
``````impl Solution {
pub fn max_profit(prices: Vec<i32>) -> i32 {
let mut max_profit = 0;
let mut min_price = std::i32::MAX;
for price in prices {
if price < min_price {
min_price = price;
} else if price - min_price > max_profit {
max_profit = price - min_price;
}
}
max_profit
}
}
``````
Swift
``````class Solution {
func maxProfit(_ prices: [Int]) -> Int {
var minPrice = Int.max
var theMaxProfit = 0

for price in prices {
if price < minPrice {
minPrice = price
} else if price - minPrice > theMaxProfit {
theMaxProfit = price - minPrice
}
}

return theMaxProfit
}
}
``````