給定一個(gè)數(shù)組 prices 籍琳,它的第 i 個(gè)元素 prices[i] 表示一支給定股票第 i 天的價(jià)格谚鄙。
你只能選擇 某一天 買入這只股票脖岛,并選擇在 未來的某一個(gè)不同的日子 賣出該股票算灸。設(shè)計(jì)一個(gè)算法來計(jì)算你所能獲取的最大利潤瘤礁。
返回你可以從這筆交易中獲取的最大利潤箭启。如果你不能獲取任何利潤秉剑,返回 0 澜汤。
示例 1:
輸入:[7,1,5,3,6,4]
輸出:5
解釋:在第 2 天(股票價(jià)格 = 1)的時(shí)候買入炎滞,在第 5 天(股票價(jià)格 = 6)的時(shí)候賣出敢艰,最大利潤 = 6-1 = 5 。
注意利潤不能是 7-1 = 6, 因?yàn)橘u出價(jià)格需要大于買入價(jià)格厂榛;同時(shí)盖矫,你不能在買入前賣出股票。
示例 2:
輸入:prices = [7,6,4,3,1]
輸出:0
解釋:在這種情況下, 沒有交易完成, 所以最大利潤為 0击奶。
提示:
1 <= prices.length <= 10^5
0 <= prices[i] <= 10^4
方法一:
class Solution:
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
min_prices = [0] * n
max_profit = [0] * n
min_prices[0] = prices[0]
max_profit[0] = 0
for i in range(1, n):
min_prices[i] = min(min_prices[i-1], prices[i])
max_profit[i] = max(max_profit[i-1], prices[i]-min_prices[i-1])
return max_profit[n-1]
方法二:參考53題
def maxSubArray(nums: List[int]) -> int:
ans = nums[0]
sum = nums[0]
for i in range(1, len(nums)):
sum = max(sum + nums[i], nums[i])
if sum > ans:
ans = sum
return ans
class Solution:
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
if n < 2: return 0
gain = [0]*n
for i in range(1, n):
gain[i-1] = prices[i] - prices[i-1]
return max(0, maxSubArray(gain))