问题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. ubuntu配置网络和静态路由(界面配置形式)

    目录 网卡配置 静态ip配置 静态路由 外网ip配置(动态获取DHCP) 内网ip和静态路由配置 本文主要针对ubuntu18.0系统进行界面形式配置网络.并配置静态路由. 网卡配置 静态ip配置 打 ...

  2. 了不起的 Deno:带你极速获取各大平台今日热榜

    摘要:Deno 是一个 JavaScript/TypeScript 的运行时,默认使用安全环境执行代码,有着卓越的开发体验. 有人的地方就有江湖,有江湖的地方就有争论.前些天,继<[译]为什么如 ...

  3. 卡耐基梅隆大学(CMU)元学习和元强化学习课程 | Elements of Meta-Learning

    Goals for the lecture: Introduction & overview of the key methods and developments. [Good starti ...

  4. scentos7安装redis,以及redis的主从配置

    redis的安装 下载redis安装包 wget http://download.redis.io/releases/redis-4.0.6.tar.gz 解压压缩包 tar -zxvf redis- ...

  5. 你想不到的win10快捷键

    1.虚拟桌面 1.1 创建 ctrl + win + d 1.2 切换 ctrl + win + 左/右箭头 1.3 关闭 ctrl + win + f4 2. 应用窗口 2.1 打开的全部最小化 w ...

  6. 转:Chrome浏览器查看网站登录 Cookie 信息的方法

    当我们使用自动签到等程序的时候一般都要用到网站Cookie,我们可以借助浏览器的扩展来获取Cookie信息,但其实通过浏览器本身的功能就可以查看Cookie信息.以Chrome类浏览器为例有以下三种方 ...

  7. PyQt(Python+Qt)学习随笔:利用QWidget部件的palette以及ColorGroup、colorRole局部调整部件的特定范围颜色

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 在<PyQt(Python+Qt)学习随笔:QWidget部件的 ...

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

    老猿Python博文目录 老猿Python博客地址 一.概述 QStandardItemModel是QAbstractItemModel的派生类,用于在Model/View架构中存储自定义数据的通用模 ...

  9. PyQt(Python+Qt)学习随笔:布局控件layoutSpacing属性

    在Qt Designer中布局控件有4个,分别是Vertical Layout(垂直布局).Horizontal Layout(水平布局).Grid Layout(网格布局).Form Layout( ...

  10. 百度前端技术学院-基础-day2

    2020.9.15 今天是学习前端基础技术的第二天,今天制作了一个在线简历,纯html的那种.帮助我复习了以前的基础知识,也增加了新的知识点,比如制作列表可以用fieldset来整合数据. 我的在线简 ...