题目描述:

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。

示例

输入: [7,1,5,3,6,4]

输出:5

定义:minval = min(minval,prices[i]) 当前的最小价格
   maxp = max(maxp,prices[i]-minval) 当前的最大利润

class Solution(object):
    def maxProfit(self, prices):
        if (len(prices)<=1):
            return 0
        minval=prices[0]
        maxp=0
        for i in range(len(prices)):
            minval= min(minval,prices[i])
            maxp= max(maxp,prices[i]-minval)
        return maxp

LeetCode(122)买卖股票的最佳时机2

题目描述:

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例

输入:[7,1,5,3,6,4]

输出:7

解析:

只买上升折线的股票,上升折线的低端为买入,高端为卖出
若存在连续上升折现,p(n)-p(1)=(p(n)-p(n-1))+(p(n-1)-p(n-2))+...+(p(2)-p(1)),p(1)为折线最低,p(n)为折线最高
等价于中间日当天卖出在买入,虽然与规则冲突,但结果一致

class Solution(object):
    def maxProfit(self, prices):
        n = len(prices)
        if n<=1:
            return 0
        maxp = 0
        for i in range(1,n):
            if prices[i]>prices[i-1]:
                tmp = prices[i]-prices[i-1]
                maxp += tmp
        return maxp

LeetCode(123)买卖股票的最佳时机3

题目描述:

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例

输入:[3,3,5,0,0,3,1,4]

输出:6

输入:[1,2,3,4,5]

输出:4

输入:[7,6,4,3,1]

输出:0

解析:

dp1[i] = max(dp[i-1], prices[i] - minval) 从前往后遍历,表示第1天到第i天之间的最大利润(通过是否在第i天卖出确认);
dp2[i] = max(dp[i+1], maxval - prices[i]) 从后往前遍历,表示第i天到最后一天之间的最大利润(通过是否在第i天买进确认);
res = max(dp1 + dp2),(dp1 + dp2)[i] 正好表示从第1天到最后一天经过两次交易的最大利润,我们的目标是找到令总利润最大的i。

class Solution(object):
    def maxProfit(self, prices):
        n=len(prices)
        if n<=1:
            return 0
        elif n==2:
            if prices[1]<prices[0]:
                return 0
            else:
                return prices[1]-prices[0]
        else:
            dp1 = [0 for _ in range(n)]
            dp2 = [0 for _ in range(n)]

            minval = prices[0]
            maxval = prices[-1]

            for i in range(1,n):
                minval=min(minval,prices[i])
                dp1[i]=max(dp1[i-1],prices[i]-minval)

            for j in range(n-2,-1,-1):
                maxval = max(maxval,prices[j])
                dp2[j] = max(dp2[j+1],maxval-prices[j])

            dp = [dp1[i]+dp2[i] for i in range(n)]
            return max(dp)

LeetCode(714)买卖股票的最佳时机含手续费

题目描述:

给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。
你可以无限次地完成交易,但是你每次交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。
返回获得利润的最大值。

示例

输入:prices = [1, 3, 2, 8, 4, 9], fee = 2

输出:8

class Solution(object):
    def maxProfit(self, prices, fee):
        n = len(prices)
        if n < 2:
             return 0
        ans = 0
        #记录着低谷
        valley = prices[0]

        for i in range(1, n):
            #发现更低的谷,弃前谷
            if prices[i] < valley:
                valley = prices[i]

            # prices[i]-fee:扣掉手续费的峰
            # 发现一个扣掉手续费的峰比谷高
            elif prices[i]-fee > valley:
                #累积差
                ans += (prices[i]-fee)-valley
                #此扣掉手续费的峰当作新谷
                #考虑连续增时,只要第一段判断付得起手续费就好
                valley = prices[i]-fee
            print("valley: ",valley)

        return ans

每日一题-——LeetCode(121)买卖股票的最佳时机的更多相关文章

  1. Java实现 LeetCode 121 买卖股票的最佳时机

    121. 买卖股票的最佳时机 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不 ...

  2. Leetcode——121. 买卖股票的最佳时机

    题目描述:买卖股票的最佳时机 题目要求求解能获得最大利润的方式? 可以定一个二维数组 d [ len ] [ 2 ] ,其中d[ i ][ 0 ] 表示前i天可以获得的最大利润:d[ i ][ 1 ] ...

  3. 【每天一题】LeetCode 121. 买卖股票的最佳时机

    开源地址:点击该链接 题目描述 * https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock * 题目描述: * 给定一个数组, ...

  4. [LeetCode] 121. 买卖股票的最佳时机 ☆(动态规划)

    https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/solution/xiang-xi-tong-su-de-si-lu- ...

  5. leetcode 121 买卖股票的最佳时机

    题目 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票. ...

  6. leetcode 121. 买卖股票的最佳时机 JAVA

    题目: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票 ...

  7. leetcode 121买卖股票的最佳时机I

    从下标1开始,维护两个变量,一个是0~i-1中的最低价格low,一个是当前的最高利润res;先更新最高利润,在更新最低价格:应用了贪心算法的基本思想,总是选择买入价格最低的股票,代码如下: 具有最优子 ...

  8. Leetcode之动态规划(DP)专题-121. 买卖股票的最佳时机(Best Time to Buy and Sell Stock)

    Leetcode之动态规划(DP)专题-121. 买卖股票的最佳时机(Best Time to Buy and Sell Stock) 股票问题: 121. 买卖股票的最佳时机 122. 买卖股票的最 ...

  9. LeetCode《买卖股票的最佳时机》系列题目,最详解

    目录 说在前面 引例:只能交易一次 一.动态数组定义 二.状态转移方程 三.初始化 四.优化 无限制买卖 一.动态数组定义 二.状态转移方程 三.初始化 四.优化 交易 2 次,最大利润? 一.动态数 ...

随机推荐

  1. 关于STM32F405的GPIO中断问题

    1. 下面的图,应该是多个引脚中断挂在同一个中断号上面,也就是PA0和PB0同时挂在一个中断源上面,那么就是说只能同时使用其中一个 寄存器的配置,确实只能有一个使用

  2. APT攻击与银行

    APT与传统攻击 APT:团队作战,拥有自研工具集,意图明确,技术高超,拥有政府或商业背景,潜伏期多达数年. 传统攻击:脚本小子,水平参差不齐,短期攻击,直接获取利益为目标. 攻击目标 APT攻击链 ...

  3. sudo启动程序引发的进程个数不对

    这几天把自己负责的服务改成了多进程模型,然后使用sudo来启动进程,示例程序如下:   int main(void)   {   fork();   while(1);   }   编译: `gcc ...

  4. 软件测试成熟度模型TCMM (转载)

    下面我们就看看是如何划分的,来评判一下各位同仁自己所在的公司,所在的级别. TCMM Level 1:Initial(初始级)   测试处于一个混乱的状态,还不能把测试同调试分开,在编码完成后才进行测 ...

  5. vue 的反向代理

    情景描述: 原本的vue打包文件是放在.net core 项目的www文件夹下去发布的.这样运行没问题,但是公司领导让服务器单独部署vue,前后端要完全分离.然后这样就出问题了,有一个上传接口的地址一 ...

  6. 推荐Pi(π)币,相当于比特币手机挖矿版

    我为什么推荐这个? 说实话,之所以发出来还是因为如果用我的邀请码注册,双方的挖矿速度都会增加些,我的邀请码:leneing,有问题可以咨询我. Pi币简介 1.在这里强烈推荐Pi币,相当于比特币手机挖 ...

  7. 模型-视图-控制器的C++解释

    模型-视图-控制器 (MVC) 并非一种技术,而是软件设计/工程的一个概念.MVC包含三个组成部分,如下图所示 模型 模型直接响应对数据的处理,比如数据库.模型不应依赖其它组成部分,即视图或控制器,换 ...

  8. tomcat配置SLL证书

    1.将jks证书复制到conf目录下 2.解除注释:88行至96行 修改代码 <Connector port="443" protocol="org.apache. ...

  9. windows强大的快捷键

    1 电脑锁屏 有些时候,需要暂时离开座位去处理其他事,可是电脑还有数据再跑. 关掉的话,数据就白跑了,不关的话,又不想让别人看到我电脑的资料. 那么就按住windows键后,再按L键. 这样电脑就直接 ...

  10. 在linux上cuda9.0 cudnn7.* 安装python3.6 tensorflow 1.5.1

    链接:https://www.jianshu.com/p/bcf37d0e4e9b 为了入门机器学习的小伙伴能安装好工具,特制作此教程 按照 Anaconda 下载网站上的说明下载并安装 Anacon ...