买卖股票的最好时机(一、二)

news2025/1/12 16:11:15

目录

买卖股票的最好时机(一)

动态规划解决

贪心思想解决

买卖股票的最好时机(二)

贪心思想解决

动态规划解决


买卖股票是经典的动态规划问题,在动态规划的学习与练习中,最令我煎熬的就是状态方程递推,经常出现状态定义好后,状态方程推了一半就推不下去了。

关于动态规划算法的思想在之前博客中有叙述:动态规划

买卖股票的最好时机(一)

题目链接:买卖股票的最好时机(一)

题目描述:

 

 例如

输入:[8,9,2,5,4,7,1]

输出:5

输入:[2,4,1]

输出:2

解题思路:对于本题,如果采用动态规划,空间复杂度是O(n),不满足题目要求的O(1),但动态规划是解决该问题的最优解,如果要以O(1)的空间复杂度解决,就采用贪心思想

动态规划解决

首先根据题意,总共只能买入一次股票,卖出一次股票,且卖出必须在买入前的某几天,那么每一天可能是持股状态,也可能是未持股状态.

状态定义:F(i, j):截至到第i天的最大收益,在这一天可能持股也可能不持股,j等于1表示持股,j等于0表示未持股

状态递推:①对于之后的每一天,可能是前面的某一天卖掉了或者是没有买入,因此到这一天的总收益与前一天相同,也可能是这一天卖掉了,因此在两者中选择较大的那个值F(i,0) = max(F(i - 1,0),F(i - 1,1) + prices[i])

                  ②如果当前持股,可能是前面的某一天买入了股票,没有卖出,也可能是今天刚买入,收益为负的股价也是选择最大的,这样才能保证利润最大,因此F(i,1) = max(F(i - 1,1),-prices[i])

初始化:在第一天,持股时:F(0,1) = -prices[0],未持股时F(0,0) = 0

返回值:F(n - 1,0)

import java.util.*;


public class Solution {
    public int maxProfit (int[] prices) {
        if (prices == null || prices.length == 0) {
            return 0;
        }
        int n = prices.length;
        int[][] dp = new int[n][2];
        dp[0][0] = 0;
        dp[0][1] = -prices[0];
        for (int i = 1; i < n; i++) {
            dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
            dp[i][1] = Math.max(dp[i - 1][1], -prices[i]);
        }
        return dp[n - 1][0];
    }
}

贪心思想解决

维护一个最低购入价和最大利润,遍历数组去更新这两个值,最后的ret就是最终的最大利润

import java.util.*;


public class Solution {
    public int maxProfit (int[] prices) {
        // write code here
        if (prices == null || prices.length == 0) {
            return 0;
        }
        int ret = 0;
        int min = prices[0];
        for (int i = 1; i < prices.length; i++) {
            ret = Math.max(ret, prices[i] - min);
            min = Math.min(min, prices[i]);
        }
        return ret;
    }
}

买卖股票的最好时机(二)

题目链接: 买卖股票的最好时机(二)

题目描述:

 例如:

输入:[8,9,2,5,4,7,1]

输出:7

输入:[5,4,3,2,1]

输出:0

贪心思想解决

该题对于买入和卖出次数无限制,只要保证在购买前必须卖出之前的股票即可,要想利润最大,那么需要每次卖出都是正收益即可,只要第二天的股票价格大于第一天,那么就在第一天买,第二天卖.

import java.util.*;
public class Solution {
    public int maxProfit (int[] prices) {
        // write code here
        if (prices == null || prices.length == 0) {
            return 0;
        }
        int ret = 0;
        for (int i = 0; i < prices.length - 1; i++) {
            if (prices[i + 1] > prices[i]) {
                ret += prices[i + 1] - prices[i];
            }
        }
        return ret;
    }
}

动态规划解决

状态定义:F(i,j):截至到第i天是否持股的最大收益,j为0表示未持股,j为1表示持股

状态递推:①对于之后的每一天,可能是前面的某一天卖掉了或者是没有买入,因此到这一天的总收益与前一天相同,也可能是这一天卖掉了,因此在两者中选择较大的那个值F(i,0) = max(F(i - 1,0),F(i - 1,1) + prices[i])

                  ②如果当前持股,可能是前面的某一天买入了彩票,没有卖出,也可能是今天刚买入,前一天不持股的收益减去今天的股票价格,也选取最大值,因此F(i,1) = max(F(i - 1,1),F(i - 1,0) - prices[i])

初始化:第一天不持股,F(0, 0) = 0,第一天持股F(0, 1) = -prices[0]

返回值:F(n - 1,0)

import java.util.*;
public class Solution {
    public int maxProfit (int[] prices) {
        // write code here
        if (prices == null || prices.length == 0) {
            return 0;
        }
        int n = prices.length;
        int[][] dp = new int[n][2];
        dp[0][0] = 0;
        dp[0][1] = -prices[0];
        for (int i = 1; i < n; i++) {
            dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
            dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
        }
        return dp[n - 1][0];
    }
}

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/19625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【毕业设计】10-基于单片机的车站安检门/磁性霍尔传感器系统设计(原理图+源码+仿真工程+论文)

【毕业设计】10-基于单片机的车站安检门/磁性霍尔传感器系统设计&#xff08;原理图源码仿真工程论文&#xff09; 文章目录【毕业设计】10-基于单片机的车站安检门/磁性霍尔传感器系统设计&#xff08;原理图源码仿真工程论文&#xff09;资料下载链接任务书设计说明书摘要设计…

css的三种引入方式

目录 三种引入方式 1.行内样式 2.内部样式(内嵌式) 3.外部样式 3.1外链式 3.2导入式 引入方式的优先级 三种引入方式 1.行内样式 行内样式就是直接把css样式添加在HTML标签中,作为style样式的属性值 <!-- 行内/内嵌/嵌入式/内联样式 --><!-- 背景颜色 backgr…

动力节点索引优化解决方案学习笔记——查询优化

3.查询优化 创建一张测试表并插入数据&#xff1a; drop table if exists students; CREATE TABLE students (id INT PRIMARY KEY AUTO_INCREMENT COMMENT "主键id",sname VARCHAR (24) COMMENT 学生姓名,age INT COMMENT 年龄,score INT COMMENT 分数,time TIMEST…

微服务与中间件系列——GateWay整合Swagger3增强Knife4j

微服务与中间件系列——GateWay整合Swagger3增强Knife4jGateWay整合Swagger3增强Knife4j&#xff08;easy模式&#xff09;目的服务端1.导入依赖2.编写配置类3.yaml配置GateWay网关1.文档枚举2.SwaggerProvider3.yaml配置结果增强版服务端1.增加配置参数类2.修改配置类3.修改ya…

Spring框架一文带你吃透IOC技术

本文目录 文章目录本文目录✨loC的技术实现✨实现步骤✨创建接口和实现类✨创建Spring的配置文件和声明bean✨创建spring容器对象✨spring容器创建对象的特点✨创建非自定义类的对象✨创建没有接口的类的对象✨获取容器中对象的信息loC&#xff0c;Inversion ofControl:控制反转…

肿瘤NGS测序行业背景介绍

肿瘤NGS测序行业背景介绍1、行业基本情况1.1 行业分类1.2 主管部门1.3 行业监管1.4 行业法规1.5 医保报销流程2、肿瘤基本介绍2.1 肿瘤基础概念2.2 癌症分期2.3 致癌风险2.4 肿瘤早期检测3、分子诊断在肿瘤早检的场景3.1 传统肿瘤早期检测方式3.2 分子诊断3.3 技术性能评价指标…

SpringBoot SpringBoot 开发实用篇 4 数据层解决方案 4.9 MongoDB 下载与安装

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇4 数据层解决方案4.9 MongoDB 下载与安装4.9.1 MongoDB 下载4.9.2 安…

PLATFORMIO学习文档之esp8266 驱动SSD1306 128x64OLED显示屏示例

写文章也是为了记录自己的学习过程&#xff0c;顺便给后来人指指路&#xff0c;迷路了可别怪我~~~~~~ 开发环境&#xff1a;PLATFORMIO 1、首先上一张我用的ESP8266开发板ESP-12E 首先新建一个工程&#xff0c;输入项目名称&#xff0c;选择自己所用的开发板&#xff0c; …

灵界的科学丨二、耳朵及手指识字的实验启示

摘自李嗣涔教授《灵界的科学》 如果有一天&#xff0c; 能教会盲人用手指或耳朵来「看」&#xff0c; 用触觉来取代眼睛&#xff0c; 人类社会中&#xff0c;将不再存在「盲」这种残疾。 发现人体潜能――耳朵与手指识字 眼睛可以观赏五彩缤纷的世界&#xff0c;耳朵可以听…

Joe 主题 Halo 移植版搭建部署教程

搭建成功之后的效果图如下 Halo安装部署 Docker 安装 Halo docker pull halohub/halo:1.5.4 # docker 从远程仓库下载镜像 docker run -it -d --name fl1906 -p 666:8090 -v ~/fl1906:/root/.halo halohub/halo:1.5.4 --restartalwaysdocker run -it -d --name walktop -p 7…

【算法系列】非线性最小二乘-列文伯格马夸尔和狗腿算法

系列文章目录 【算法系列】卡尔曼滤波算法 【算法系列】非线性最小二乘求解-直接求解法 【算法系列】非线性最小二乘求解-梯度下降法 【算法系列】非线性最小二乘-高斯牛顿法 【算法系列】非线性最小二乘-列文伯格马夸尔和狗腿算法 文章目录 系列文章 文章目录 前言 …

期末网页设计作业素材 (民宿 5页 带地图)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 游景点介绍 | 旅游风景区 | 家乡介绍 | 等网站的设计与制作 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结构 CSS&…

JSON解析看这一篇就够了

目录 文章目录[toc]一、JSON是什么 &#xff08;&#xffe3;︶&#xffe3;&#xff09;↗总而言之&#xff1a;二、为什么要用JSON三、不同的JSON解析方式3.1 gson和[fastjson](https://so.csdn.net/so/search?qfastjson&spm1001.2101.3001.7020)简而言之3.2 gson案例3.…

15.Servlet

目录 1.Servlet的日常开发 1.WebServlet(...此处填写资源路径) 1.那么什么时候Tomcat会启动失败&#xff1f; 2.响应体是文本内容&&字符集编码是uft-8 3.读取请求参数 4.资源的重定向&#xff08;redirect&#xff09; 2.面试问题&#xff1a;GET和POST有什么区…

代码随想录算法训练营三期 day 23 - 二叉树(9)

669. 修剪二叉搜索树 原文链接&#xff1a;669. 修剪二叉搜索树 题目链接&#xff1a;669. 修剪二叉搜索树 视频链接&#xff1a;669. 修剪二叉搜索树 在上图中我们发现结点 000 并不符合区间要求&#xff0c;那么将结点 000 的右孩子 结点 222 直接赋给 结点 333 的左孩子就…

Java设计模式 (1) —— Iterator迭代器模式

拿到这个话题&#xff0c;首先搞清楚&#xff1a;什么是迭代器&#xff1f; 大家都学过 for-i 循环&#xff0c;for-i循环的本质就是 通过i 或者 i-- &#xff0c;以实现 从数据的一端 一个一个地遍历数据元素&#xff0c;直到另一端的最后一个元素&#xff0c;将这里 i 的通用…

【Linux】基础IO —— 深入理解文件系统 | 软硬链接

&#x1f308;欢迎来到Linux专栏~~ 深入理解文件系统 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的…

安全需求和挑战

安全需求和挑战 从风险管理的角度讲&#xff0c;主要就是管理资产、威胁、脆弱性 和防护措施及其相关关系&#xff0c;最终保障云计算平台的持续安全&#xff0c;以及 其所支撑的业务的安全。 云计算平台是在传统 IT技术的基础上&#xff0c;增加了一个虚拟化 层&#xff0c;并…

大数据之——Hive

目录1. Hive 基本概念1.1 什么是 Hive1.2 Hive 的优缺点1.2.1 优点1.2.2 缺点1.3 Hive 架构原理2. Hive 安装2.1 Hive 安装地址2.2Hive 安装部署2.3MySQL 安装2.4 Hive 元数据配置到 MySQL2.4.1 拷贝驱动2.4.2 配置 Metastore 到 MySQL2.4.3 再次启动 Hive2.5 使用元数据服务的…

让学前端不再害怕英语单词(二)

写了本专栏的第一章让学前端不再害怕英语单词&#xff08;一&#xff09;后&#xff0c;反响热度还是比较高的&#xff0c;截止现在已经有20个收藏量了&#xff0c;所以趁热打铁来更第二章 第一章我们简单的介绍了html&#xff0c;css和js的部分高频单词&#xff0c;因为html要…