[leetcode]BestTimetoBuyandSellStock买卖股票系列问题
问题1:
If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock),
design an algorithm to find the maximum profit.
Example 1:
Input: [7, 1, 5, 3, 6, 4]
Output: 5
max. difference = 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
In this case, no transaction is done, i.e. max profit = 0.
动态规划,和寻找最大子串差不多,设置三个变量,一个最小值min,一个局部解cur,一个全局解res,
* min = min(min,price[i]),cur = price[i] - min,res = max(cur,res)
* 遍历过程中不断更新三个量,最后全局解就是结果
public int maxProfit(int[] prices) {
if (prices.length < 1)
return 0;
int min = prices[0];
int res = 0;
int cur = 0;
for (int i = 1; i < prices.length; i++) {
//如果当前值比最小值还小,那么更新min之后可以停止此次循环了
if (prices[i] <= min)
{
min = prices[i];
continue;
}
cur = prices[i] - min;
res = Math.max(cur,res);
}
return res;
}
问题2:
Say you have an array for which the ith element is the price of a given stock on day i.
Design an algorithm to find the maximum profit.
You may complete as many transactions as you like
(ie, buy one and sell one share of the stock multiple times).
However, you may not engage in multiple transactions at the same time
(ie, you must sell the stock before you buy again).
和1不同的是这次可以多次交易了,约束条件是必须卖了才能再买(当天卖了接着买也行)
贪心算法:只需要每次考察两天的价格情况,能赚就卖,不能赚就考察接下来两天,把所有赚的钱加起来就是结果
*由于当前两天的买卖情况不会影响前后的情况,所以可以用贪心算法
public int maxProfit(int[] prices) {
if (prices.length < 2)
return 0;
int sta = 0;
int end = 1;
int res = 0;
while (end < prices.length)
{
int cur = prices[end] - prices[sta];
if (cur > 0)
{
res += cur;
}
sta++;
end++;
}
return res;
}
问题3:
这次是可以交易任意次,但是每次卖出的时候都要收取一定费用,所以不能用贪心了,因为贪心只能考虑相邻的两个是否交易,但是这次可能出现前边的留着不卖而后边卖,要用常规的动态规划,但是状态法方程和动态变量都有两个
直接上代码
public static int maxProfit(int[] prices, int fee) {
/*
一开始想着用贪心算法,和之前做的那个可以多次交易的题目一样,但是试了试是不行的,因为前边买的情况对后边会产生影响
因为这次交易有费用,不是只要有差价就卖,要选差价最大的组合卖,用动态规划
每天都有两种状态,一种是当前持有股票,一种是没有股票,算出两种情况的最大收益情况,最后返回最后一天不持有股票的情况就是收益最大
*/
if (prices.length==0)
return 0;
int[] not = new int[prices.length];
int[] hold = new int[prices.length];
hold[0] = -prices[0];
for (int i = 1; i < prices.length; i++) {
//如果今天没有持有股票,那么有两种情况,昨天有股票,今天卖了。或者昨天就没有股票,今天也没买,选收益大的。
not[i] = Math.max(not[i-1],hold[i-1] + prices[i]-fee);
//如果今天持有股票,那么要么是昨天就持有,今天没卖。要么昨天没有,今天买的
hold[i] = Math.max(hold[i-1],not[i-1]-prices[i]);
}
return not[prices.length-1];
}
未完待续...
[leetcode]BestTimetoBuyandSellStock买卖股票系列问题的更多相关文章
- 每日一题-——LeetCode(121)买卖股票的最佳时机
题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格.如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润.注意你不能在买入股票前卖出股票 ...
- LeetCode《买卖股票的最佳时机》系列题目,最详解
目录 说在前面 引例:只能交易一次 一.动态数组定义 二.状态转移方程 三.初始化 四.优化 无限制买卖 一.动态数组定义 二.状态转移方程 三.初始化 四.优化 交易 2 次,最大利润? 一.动态数 ...
- Leetcode——121. 买卖股票的最佳时机
题目描述:买卖股票的最佳时机 题目要求求解能获得最大利润的方式? 可以定一个二维数组 d [ len ] [ 2 ] ,其中d[ i ][ 0 ] 表示前i天可以获得的最大利润:d[ i ][ 1 ] ...
- Leetcode 188.买卖股票的最佳时机IV
买卖股票的最佳时机IV 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 k 笔交易. 注意: 你不能同时参与多笔交易(你必 ...
- Leetcode 123.买卖股票的最佳时机III
买卖股票的最佳时机III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与多笔交易(你 ...
- 【Leetcode】买卖股票-贪心算法
题目: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必 ...
- Java实现 LeetCode 714 买卖股票的最佳时机含手续费(动态规划 || 迭代法)
714. 买卖股票的最佳时机含手续费 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 :非负整数 fee 代表了交易股票的手续费用. 你可以无限次地完成交易,但是你每次交 ...
- Java实现 LeetCode 188 买卖股票的最佳时机 IV
188. 买卖股票的最佳时机 IV 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 k 笔交易. 注意: 你不能同时参与多 ...
- Java实现 LeetCode 123 买卖股票的最佳时机 III(三)
123. 买卖股票的最佳时机 III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与 ...
随机推荐
- 痞子衡嵌入式:深入i.MXRT1050系列ROM中串行NOR Flash启动初始化流程
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是深入i.MXRT1050系列ROM中串行NOR Flash启动初始化流程. 从外部串行NOR Flash启动问题是i.MXRT系列开发最 ...
- Fiddler 4 (过滤器的使用)
1.先找到过滤器并且勾选 2.勾选 并填写要过滤的地址 3.运行 最终效果如下
- lcm的和(莫比乌斯反演)
马上开学了,加一个操作系统和数据库标签 不玩了,求1-n和1-m的lcm(i,j)和 首先想到把lcm(i,j)转化为i * j / gcd(i, j) 然后gcd,要素察觉,开始枚举d使得gcd(i ...
- 你说说对Java中SPI的理解吧
前言 最近在面试的时候被问到SPI了,没回答上来,主要也是自己的原因,把自己给带沟里去了,因为讲到了类加载器的双亲委派模型,后面就被问到了有哪些是破坏了双亲委派模型的场景,然后我就说到了SPI,JND ...
- Qt模型视图结构遇见的小问题
在本文的最开始,我们来看两个帮助文档内容: selectionMode : SelectionMode This property holds which selection mode the vie ...
- (转)oracle体系结构
对于一门技术的学习,尤其是像Oracle database这种知识体系极其庞杂的技术来讲,从宏观上了解其体系结构是至关重要的.同时,个人认为,未必是专业DBA人员才需要了解其体系结构(固然对于数据库专 ...
- IntelliJ IDEA2019.3.2破解/永久激活/安装教程
我想大家用过史上最好的开发工具就是idea了,没有之一!看到大家都在找idea的激活教程,今天我也在这里跟大家分享一下. 本教程针对现在官网针对的版本是idea2019.3.2,为防止以后会更新破解失 ...
- PostgreSQL 如何忽略事务中错误
在 PostgreSQL 的事务中:执行的SQL遇到错误(书写,约束限制):该事务的已经执行的SQL都会进行rollback.那如何忽略其中的错误.将SQL执行到底?在事务中设置 ON_ERROR_R ...
- sqli-labs less5-6(双查询注入)
less-5 双查询注入 利用count(), group by, floor(), rand()报错 双查询注入的原理参考博客 打开less-5 用union注入的流程进行发现页面不会有回显,所以u ...
- 在RAC上部署OGG并配置OGG高可用
目录 简介 环境信息 安装OGG 配置数据库 开启数据库级别日志补充 在dbdc1为OGG单独创建TNS 创建OGG管理用户及其表空间 配置OGG 设置OGG全局参数 Source端,OGG设置, 配 ...