问题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. UPX使用教程

    UPX是一个通用可执行文件压缩器,由于其具有: 压缩率高:压缩效果优于zip/gzip: 解压速度快:在奔腾133上即可达到大约10MB/秒: 压缩的可执行文件没有额外的内存开销: 安全:可以列表,检 ...

  2. Flutter——Dart Extension扩展方法的使用

    dart的extension方法可以给已经存在的类添加新的函数,通过extension我们可以封装一些常用方法,提高开发效率. 例一:扩展String 给string添加一个log打印方法 exten ...

  3. 软件工程团队作业-测试与发布(Alpha版本)

    Alpha版本测试报告 功能测试报告 概述 测试阶段:alpha验收测试 测试方法:手动功能测试 测试环境(测试矩阵) Windows操作系统(win10)附带"Windows讲述人&quo ...

  4. Markdown常用数学符号&公式

    符号 代码 描述 \(\sim\) $\sim$ 波浪号 \(\sum\) $\sum$ 求和公式 \(\sum_{i=0}^n\) $\sum_{i=0}^n$ 求和上下标 \(\times\) $ ...

  5. MySQL事务(一)认识事务

    简单来说,事务就是要保证一组数据库操作,要么全部完成,要么全部失败. 为什么要有事务 数据库中的数据是共享资源,因此数据库系统通常要支持多个用户的或不同应用程序的访问,会出现并发存取数据的现象. 数据 ...

  6. Python 中的哈希表

    Python 中的哈希表:对字典的理解   有没有想过,Python中的字典为什么这么高效稳定.原因是他是建立在hash表上.了解Python中的hash表有助于更好的理解Python,因为Pytho ...

  7. 题解-洛谷P5217 贫穷

    洛谷P5217 贫穷 给定长度为 \(n\) 的初始文本 \(s\),有 \(m\) 个如下操作: \(\texttt{I x c}\),在第 \(x\) 个字母后面插入一个 \(c\). \(\te ...

  8. Power BI八年回望记

    本人从事BI,数据仓库领域相关工作15个年头,这15年目睹了这个方向从火爆到逐渐被大数据领域不断吞食.中间零散关注Power BI好长时间,也算目睹了它的成长. 那天在网络上搜索power bi,无意 ...

  9. 树莓派开发笔记(十一):蓝牙的使用,BlueZ协议(双树莓探测rssi并通过蓝牙互传获取的rssi信号强度)

    若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/110940484长期持续带来更多项目与技术分享, ...

  10. 基于menu小插件探索工程实践

    目录 一.准备工作 1.C/C++环境搭建 2.VSCode的配置 (1) 安装插件: (2) 设置配置文件: 二.工程化编程实战 1.模块化设计 2.可重用设计:进一步抽象 menu的进一步优化 可 ...