手撕代码:leetcode 309最佳买卖股票时机含冷冻期
转载于:https://segmentfault.com/a/1190000014746613
给定一个整数数组,其中第i个元素代表了第i天的股票价格。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
*你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
*卖出股票后,你无法在第二天买入股票(即冷冻期为1天)
示例:
输入: [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
思路和代码
这里转述leetcode上一个非常漂亮的解答。
在第i天时,我们可以进行三种操作,抛出或是买入或是啥都不干。但是具体下来,又有四种情况:
1.在持有一只股票的时候抛出
2.在持有一只股票的时候啥都不干
3.在持有0只股票的时候啥都不干
4.在持有0只股票的时候买入
而这些操作之间又存在潜在的联系,也就是说我如果在第i天进行以上四种操作之一,那么意味着我在第i-1天一定进行了四种操作中的某一种,从而支持我第i天的操作。具体关联如下:
1.第i天之行的操作:在持有一只股票的时候抛出=>在第i-1天执行的操作:在持有一只股票的时候啥都不干/在持有0只股票的时候买入
2.第i天执行的操作:在持有一只股票的时候啥也不干=>在第i-1天执行的操作:在持有一只股票的时候啥也不干/在持有0只股票的会后买入
3.第i天执行的操作:在持有0只股票的时候买入=>在第i-1天执行的操作:在持有0只股票的时候啥也不做
4.第i天执行的操作:在持有0只股票的时候啥也不做=>在第i-1天执行的操作:在持有0只股票的时候啥也不做/在持有一只股票的时候抛出
我们采用动态规划的思想,分别记录第i-1天的时候这四种情况的最大收入,并由此比较并得出第i天时这四种情况的最大收入。最后比较最后一天这四种情况可以得到的最大收益,代码如下:
1 int maxProfix(int prices[],int size)
2 {
3 if(size==0)return 0;
4 int hasOneDoNothing=-prices[0];
5 int hasOneSellIt=0;
6 int hasZeroDoNothing=0;
7 int hasZeroBuyOne=-prices[0];
8 for (int i = 0; i <size ; ++i) {
9 int tmp1=hasOneDoNothing;
10 int tmp2=hasOneSellIt;
11 int tmp3=hasZeroDoNothing;
12 int tmp4=hasZeroBuyOne;
13 hasOneDoNothing=tmp1>tmp4?tmp1:tmp4;
14 hasOneSellIt=(tmp1>tmp4?tmp1:tmp4)+prices[i];
15 hasZeroDoNothing=tmp2>tmp3?tmp2:tmp3;
16 hasZeroBuyOne=tmp3-prices[i];
17 }
18 return hasZeroDoNothing>hasOneSellIt?hasZeroDoNothing:hasOneSellIt;
19 }
这里你可能会困惑,为什么只比较 在最后一天持有0只股票并且不进行任何操作 和 在最后一天持有股票并抛出这两种情况呢?
假设我们最后一天持有股票并且不抛出,那么意味着在之前买入最后一只股票的那一天,如果我们不购入将会得到更大的收益。因此抛出一定比不抛出得到的损失小。
至于另一种情况,即最后一天又买入了股票,显然它一定比不买入股票得到的收益少啊。
因此我们只要比较最初提出的两种情况即可。
手撕代码:leetcode 309最佳买卖股票时机含冷冻期的更多相关文章
- Java实现 LeetCode 309 最佳买卖股票时机含冷冻期
309. 最佳买卖股票时机含冷冻期 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 . 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股 ...
- Leetcode 309.最佳买卖股票时机含冷冻期
最佳买卖股票时机含冷冻期 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格. 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 你不 ...
- Leetcode之动态规划(DP)专题-309. 最佳买卖股票时机含冷冻期(Best Time to Buy and Sell Stock with Cooldown)
Leetcode之动态规划(DP)专题-309. 最佳买卖股票时机含冷冻期(Best Time to Buy and Sell Stock with Cooldown) 股票问题: 121. 买卖股票 ...
- leecode 309. 最佳买卖股票时机含冷冻期
/***** //sell[i]表示截至第i天,最后一个操作是卖时的最大收益: //buy[i]表示截至第i天,最后一个操作是买时的最大收益: //cool[i]表示截至第i天,最后一个操作是冷冻期时 ...
- [Leetcode] 第309题 最佳买卖股票时机含冷冻期
一.题目描述 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 . 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 你不能同时参与 ...
- 【LeetCode】309、最佳买卖股票时机含冷冻期
Best Time to Buy and Sell Stock with Cooldown 题目等级:Medium 题目描述: Say you have an array for which the ...
- leetcode 最佳买卖股票时机含冷冻期
这道题算是股票问题的变体之一,主要在于不限制交易次数而存在冷冻期,所以我们需要对我们的dp数组进行改变,第一维是指第几天,第二维是指是否持有股票,在这里因为不限制交易次数k,所以并未涉及第三维度. 同 ...
- [Swift]LeetCode309. 最佳买卖股票时机含冷冻期 | Best Time to Buy and Sell Stock with Cooldown
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- leetcode题解-122买卖股票的最佳时期
题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...
随机推荐
- uniapp上传图片转base64码案例
uni.chooseImage({ count: 9, success: res => { this.imageList = this.imageList.concat(res.tempFile ...
- (Unity)XML文件读写与IO文件操作类使用介绍
using System.Xml; //xml文件操作命名空间 #region 写入操作 void WriteXMLFile(string _fileName) { Xm ...
- 搭建sock5代理
安装 下载脚本 wget --no-check-certificate https://raw.github.com/Lozy/danted/master/install.sh -O install. ...
- rinetd基于内网TCP端口转发
在Linux系统中大多数情况选择用iptables来实现端口转发,iptables虽然强大,但配置不便,而且新手容易出错.在此分享另一个TCP/UDP端口转发工具rinetd,rinetd体积小巧,配 ...
- 【axios三部曲】一、使用axios
axios作为一个基于promise的网络请求库,它同时支持浏览器和node环境,是我们开发中常用的一个库 它的一些特性: 从浏览器发出XMLHttpRequests 从node.js发出http ...
- 【C# 线程】 atomic action原子操作|primitive(基元、原语)
概念 原子操作(atomic action):也叫primitive(原语.基元),它是操作系统用语范畴.指由若干条指令组成的,用于完成一定功能的一个过程. 原语是由若干个机器指令构成的完成某种特定 ...
- 白话OAuth2.0
一.OAuth是什么 OAuth简写:Open Authorization(开放授权).百度百科上是这么说的:为用户资源提供了一个安全,开放而又简易的标准.解决了密码的反模式问题(第三方应用不需要知 ...
- 基于Netty的一个WeoSocket通信服务器与客户端代码(非JS代码)
基于Netty的一个WeoSocket通信服务器与客户端代码(非JS代码) 咳咳,在这里呢,小轩就不多说什么是WebSocket的,还有呢,小轩为什么不给出JS-Client代码?网上太多代码可以用了 ...
- C语言刷 堆(优先队列)
703. 数据流中的第 K 大元素 /* 小根堆 */ typedef struct { int heapCapacity; int heapSize; int *heap; } KthLargest ...
- CentOS8安装Geant4笔记(一):Geant4介绍、编译和安装
前言 在服务器CentOS8.2上安装geant4软件. GEANT4 介绍 Geant4 是一个用于模拟粒子穿过物质的工具包.其应用领域包括高能.核物理和加速器物理,以及医学和空间科学研 ...