题目描述:
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。
示例 1:
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
示例 2:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
题目分析:
看到这道题,我想到的就先写条件嘛,写多了题就有感觉了,他的测试集里面肯定有空的,所以我最开始就判断,如果长度为空,那么就返回0,然后我想到的是另外两个条件,如果它的测试集里面是一个顺序的list,或者是一个反序的list怎么办,然后我就又判断,如果它给的测试集与升序或降序的顺序相同,那就return 最后一个减第一个,或者是return 0,然后才是计算部分,我先创建一个名叫big_list的列表,然后让每个在后面的数都与在它前面的数相减,然后存入big_list中,然后直接return max(big_list),我的这个思路其实很暴力法...唉,还是太蠢了,贴一下代码吧,不过这个代码还是太慢了,超出了时间限制。
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)
然后我们再看看别人的代码吧,很简洁,感觉写算法还是要深思熟虑一下,然后联系一下实际,不要自己想象着写,这样写不出太好的算法,
大家普遍运用的都是这个思路,就是说我们在最低处买入,然后在最高处卖出,得出的自然就是最大的利润。那么我们顺着这个逻辑去写代码,就很容易能写得出了。
这条代码就是运用这个思路,他刚开始不知道哪个是最低的嘛,然后就规定说测试集的第一个数就是最低的,然后利润初始化为0,然后走循环,如果循环中有元素大于第一个数,那就是说有利润嘛,然后就把他们的差赋给利润嘛,然后如果这个差小于利润,那么显然,这个元素比之前我们定义的第一个数还要小,那就把这个元素当作是最低的数,然后一切推倒重来,计算利润。。。大概思路就是这样
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
唉....我好捞啊,又被吊锤了,提升自己的逻辑思维能力是很重要的。干巴爹(ง •_•)ง