问题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买卖股票系列问题的更多相关文章

  1. 每日一题-——LeetCode(121)买卖股票的最佳时机

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

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

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

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

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

  4. Leetcode 188.买卖股票的最佳时机IV

    买卖股票的最佳时机IV 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 k 笔交易. 注意: 你不能同时参与多笔交易(你必 ...

  5. Leetcode 123.买卖股票的最佳时机III

    买卖股票的最佳时机III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与多笔交易(你 ...

  6. 【Leetcode】买卖股票-贪心算法

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

  7. Java实现 LeetCode 714 买卖股票的最佳时机含手续费(动态规划 || 迭代法)

    714. 买卖股票的最佳时机含手续费 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 :非负整数 fee 代表了交易股票的手续费用. 你可以无限次地完成交易,但是你每次交 ...

  8. Java实现 LeetCode 188 买卖股票的最佳时机 IV

    188. 买卖股票的最佳时机 IV 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 k 笔交易. 注意: 你不能同时参与多 ...

  9. Java实现 LeetCode 123 买卖股票的最佳时机 III(三)

    123. 买卖股票的最佳时机 III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与 ...

随机推荐

  1. 五. Webpack详解

    1. 什么是Webpack 1.1 引入 什么是webpack?这个webpack还真不是一两句话可以说清楚的. 我们先看看官方的解释:At its core, webpack is a static ...

  2. gradle插件版本号和Gradle版本号对应关系

    Plugin version Required Gradle version 1.0.0 - 1.1.3 2.2.1 - 2.3 1.2.0 - 1.3.1 2.2.1 - 2.9 1.5.0 2.2 ...

  3. 在之前的EventHandler中的参数类型必须继承EventArgs,现在已经去掉这个约束了。

    分别是vs2008和vs2012的对比,可以看到2012已经去掉了约束条件.

  4. Promise自定义,看我如何征服你

    自定义代码 这里是我自定义的Promise,如果想看原版,可以跳过最后有符合PromiseA+规范的源码 class 承诺 { constructor(处理器函数) { //1. 处理器函数是在_ne ...

  5. 通过Apache Hudi和Alluxio建设高性能数据湖

    T3出行的杨华和张永旭描述了他们数据湖架构的发展.该架构使用了众多开源技术,包括Apache Hudi和Alluxio.在本文中,您将看到我们如何使用Hudi和Alluxio将数据摄取时间缩短一半.此 ...

  6. 老猿Python博客文章目录索引

    本目录提供老猿Python所有相关博文的一级目录汇总,带星号的为收费专栏: 一.专栏列表 本部分为老猿所有专栏的列表,每个专栏都有该专栏置顶的博文目录: 专栏:Python基础教程目录 专栏:* 使用 ...

  7. PyQt(Python+Qt)学习随笔:windows下使用pyinstaller将PyQt文件打包成exe可执行文件

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 在<windows下使用pyinstaller将多个目录的Pyt ...

  8. PyQt(Python+Qt)学习随笔:model/view架构中的QStandardItemModel使用案例

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 1.案例说明 在应用中展示指定目录的图标文件的文件名和图标,界面就是一个简单的窗口上面放置一名为li ...

  9. 性能测试学习之路 (四)jmeter 脚本开发实战(JDBC &JMS &接口脚本 & 轻量级接口自动化测试框架)

    1.业务级脚本开发 登录脚本->思路:在线程组下新建两个HTTP请求,一个是完成访问登录页,一个是完成登录的数据提交.   步骤如下: 1) 访问登录页 2) 提交登录数据的HTTP PS:对于 ...

  10. Java基础学习之数据类型、基础语法与数组(3)

    目录 1.数据类型 1.1.基本数据类型 1.2.引用数据类型 1.3.自动装箱与拆箱 2.基础语法 2.1.标识符 2.2.修饰符 2.2.1.访问控制修饰符 2.2.2.非访问控制修饰符 2.3. ...