每日一题-9

题目描述

  1. 买卖股票的最佳时机
    给定一个数组,它的第 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.


解题思路

1.学习了别人针对股票类型的问题详解。链接如下
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/solution/yi-ge-fang-fa-tuan-mie-6-dao-gu-piao-wen-ti-by-l-3/

2.这个题可以改成一个最大上升子序列和问题
首先我们求出所有的prices[i+1]-prices[i]的值,存为数组。
prices[3]-prices[0]=prices[3]-prices[2]+prices[2]-prices[1]+prices[1]-prices[0]

如股票价格为[7,1,5,3,6,4],则可以转换为求数组[-6, 4, -2, 3, -2]

diff =[] #存储所有prices[i+1]-prices[i]
sum = 0
maxS = 0
for price in prices:
    sum = max(price, price+sum)
    maxS = max(sum, maxS)
return maxS

3.由于这题的限制没那么多,也可以采用贪心算法进行求解,每次保存一个局部最小值当买入。

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        maxP = 0
        low = float("inf")
        for price in prices:
            if price < low:
                low = price
            maxP = max(maxP, price - low);
        return maxP

代码

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n = 0#初始第一天,手里没股票,收入为0
        y = float("-inf") #初始第一天,手里有股票,表示不可能

        for price in prices:
            #今天手里没有股票,分两种情况
            #1.昨天就没有股票,今天也没有买
            #2.昨天有股票,今天卖出去了
            n = max(n, y + price) 
            #今天手里有股票,分两种情况
            #1.昨天就有了,今天没卖出去
            #2.昨天没有股票,今天刚卖的
            y = max(y, -price)

        return n #最后肯定是手里没有股票赚的更多一些,所以返回n
全部评论

相关推荐

服从性笔试吗,发这么多笔,现在还在发。
蟑螂恶霸zZ:傻 x 公司,发两次笔试,两次部门匹配挂,
投递金山WPS等公司10个岗位 >
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务