题目链接
Say you have an array for which the ith element is the price of a given stock on day i.
If you were only permitted to complete at most one transaction (i.e., buy one and sell one share of the stock), design an algorithm to find the maximum profit.
Note that you cannot sell a stock before you buy one.
Example 1:
Input: [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.
Not 7-1 = 6, as selling price needs to be larger than buying price.
Example 2:
Input: [7,6,4,3,1]
Output: 0
Explanation: In this case, no transaction is done, i.e. max profit = 0.
python3代码实现:
class Solution:
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
if len(prices) <= 1:
return 0
# 解题思路:以当前价格为参考点,找到此价格之前的最小值,然后做差即为最大利润。
minprice = float('inf')
maxprice = 0
for price in prices:
minprice = min(minprice, price)
profit = price - minprice #遍历到此时price的最大利润
maxprice = max(maxprice, profit)
return maxprice
注:后面两种方式在LeetCode上编译不通过,时间复杂度太高了,原因是max()函数对一堆数据进行操作造成的。而第一种方式max()里只有两个数。
python3第二种方式实现:
class Solution:
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
if len(prices) == 0:
return 0
arr = []
arr_max_list = []
for i, i_v in enumerate(prices):
for j, j_v in enumerate(prices[i:]):
arr.append(j_v - i_v)
arr_max_list.append(max(arr))
arr.clear()
return max(arr_max_list)
python3第三种方式实现:
class Solution:
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
if len(prices) == 0:
return 0
arr = []
arr_max_list = []
for i, i_v in enumerate(prices):
for j, j_v in enumerate(prices[i:]):
arr.append(j_v - i_v)
arr_max_list.append(max(arr))
arr.clear()
return max(arr_max_list)
for i in range(len(prices)):
arr_max_list.append(max(prices[i:]) - prices[i])
return max(arr_max_list)