題目描述:
給定一個(gè)數(shù)組,它的第 i 個(gè)元素是一支給定股票第 i 天的價(jià)格。
如果你最多只允許完成一筆交易(即買(mǎi)入和賣(mài)出一支股票),設(shè)計(jì)一個(gè)算法來(lái)計(jì)算你所能獲取的最大利潤(rùn)。
注意你不能在買(mǎi)入股票前賣(mài)出股票。
示例 1:
輸入: [7,1,5,3,6,4]
輸出: 5
解釋: 在第 2 天(股票價(jià)格 = 1)的時(shí)候買(mǎi)入,在第 5 天(股票價(jià)格 = 6)的時(shí)候賣(mài)出,最大利潤(rùn) = 6-1 = 5 。
注意利潤(rùn)不能是 7-1 = 6, 因?yàn)橘u(mài)出價(jià)格需要大于買(mǎi)入價(jià)格。
示例 2:
輸入: [7,6,4,3,1]
輸出: 0
解釋: 在這種情況下, 沒(méi)有交易完成, 所以最大利潤(rùn)為 0。
題目分析:
看到這道題,我想到的就先寫(xiě)條件嘛,寫(xiě)多了題就有感覺(jué)了,他的測(cè)試集里面肯定有空的,所以我最開(kāi)始就判斷,如果長(zhǎng)度為空,那么就返回0,然后我想到的是另外兩個(gè)條件,如果它的測(cè)試集里面是一個(gè)順序的list,或者是一個(gè)反序的list怎么辦,然后我就又判斷,如果它給的測(cè)試集與升序或降序的順序相同,那就return 最后一個(gè)減第一個(gè),或者是return 0,然后才是計(jì)算部分,我先創(chuàng)建一個(gè)名叫big_list的列表,然后讓每個(gè)在后面的數(shù)都與在它前面的數(shù)相減,然后存入big_list中,然后直接return max(big_list),我的這個(gè)思路其實(shí)很暴力法...唉,還是太蠢了,貼一下代碼吧,不過(guò)這個(gè)代碼還是太慢了,超出了時(shí)間限制。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
le = len(prices)
if le == 0:
return 0
if prices == sorted(prices, reverse=True):
return 0
if prices == sorted(prices, reverse=False):
return prices[le-1]-prices[0]
big_list = []
for i in range(le-1,-1,-1):
j = 0
while i > j:
big_list.append(prices[i]-prices[j])
j += 1
return max(big_list)
然后我們?cè)倏纯磩e人的代碼吧,很簡(jiǎn)潔,感覺(jué)寫(xiě)算法還是要深思熟慮一下,然后聯(lián)系一下實(shí)際,不要自己想象著寫(xiě),這樣寫(xiě)不出太好的算法,
大家普遍運(yùn)用的都是這個(gè)思路,就是說(shuō)我們?cè)谧畹吞庂I(mǎi)入,然后在最高處賣(mài)出,得出的自然就是最大的利潤(rùn)。那么我們順著這個(gè)邏輯去寫(xiě)代碼,就很容易能寫(xiě)得出了。
這條代碼就是運(yùn)用這個(gè)思路,他剛開(kāi)始不知道哪個(gè)是最低的嘛,然后就規(guī)定說(shuō)測(cè)試集的第一個(gè)數(shù)就是最低的,然后利潤(rùn)初始化為0,然后走循環(huán),如果循環(huán)中有元素大于第一個(gè)數(shù),那就是說(shuō)有利潤(rùn)嘛,然后就把他們的差賦給利潤(rùn)嘛,然后如果這個(gè)差小于利潤(rùn),那么顯然,這個(gè)元素比之前我們定義的第一個(gè)數(shù)還要小,那就把這個(gè)元素當(dāng)作是最低的數(shù),然后一切推倒重來(lái),計(jì)算利潤(rùn)。。。大概思路就是這樣
class Solution:
def maxProfit(self, prices: List[int]) -> int:
if not prices:
return 0
low = prices[0]
profit = 0
for i in prices:
if i - low > profit:
profit = i - low
if i < low:
low = i
return profit
唉....我好撈啊,又被吊錘了,提升自己的邏輯思維能力是很重要的。干巴爹(? ?_?)?