买卖股票大合集

news2025/3/11 9:25:21

刷题刷题往死里刷。


121. 买卖股票的最佳时机

链接

121. 买卖股票的最佳时机

思路:

二次做所以有思路了, 从头遍历数组,维持一个最小值,且遇到一个值就计算差值,且维护这个最大值为答案。

class Solution {
    public int maxProfit(int[] prices) {
        int min = prices[0], ans = 0;
        for(int i = 0; i < prices.length; i++){
            ans = Math.max(ans, prices[i] - min);
            min = Math.min(min, prices[i]);
        }
        return ans;
    }
}

122. 买卖股票的最佳时机 II

链接

. - 力扣(LeetCode)

思路:

由于可以在同一天买入卖出,可以将收入理解为所有利润和,有差的全部记录下来,没有的默认当天买入卖出。

class Solution {
    public int maxProfit(int[] prices) {
        //这个是求利润和
        int len = prices.length;
        int ans = 0;
        for(int i = 1; i < len; i++){
            if(prices[i] > prices[i - 1]){
                ans+=(prices[i] - prices[i -1]);
            }
        }
        return ans;
        
    }
}

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

. - 力扣(LeetCode)

自己的思路

 可以将题目理解为找两段不相交的相差最大的数。

不会写

官方题解

感觉很合理但是又想不出来。

class Solution {
    public int maxProfit(int[] prices) {
        int n = prices.length;
        int buy1 = -prices[0], sell1 = 0;//买入一个,已经完成一单(当天买入卖出)
        int buy2 = -prices[0], sell2 = 0;//买了两个,已经完成两单(同一天买入卖出并再次卖如, 买入卖出两次)
        for(int i = 1; i < n; i ++){
            buy1 = Math.max(buy1, -prices[i]);//买入价格更低的
            sell1 = Math.max(sell1, buy1 + prices[i]);//找差更高的价格
            buy2 = Math.max(buy2, sell1 - prices[i]);//是否买入
            sell2 = Math.max(sell2, buy2 + prices[i]);//是否卖出
        }
        return sell2;

    }
}

收获

初始化
int buy1 = -prices[0], sell1 = 0;//买入一个,已经完成一单(当天买入卖出)
int buy2 = -prices[0], sell2 = 0;//买了两个,已经完成两单(同一天买入卖出并再次卖如, 买入卖出两次)
状态转移式子
buy1 = Math.max(buy1, -prices[i]);//买入价格更低的
sell1 = Math.max(sell1, buy1 + prices[i]);//找差更高的价格
buy2 = Math.max(buy2, sell1 - prices[i]);//是否买入
sell2 = Math.max(sell2, buy2 + prices[i]);//是否卖出

有点难,多理解


188.买卖股票的最佳时机

. - 力扣(LeetCode)

自己的思路

感觉跟上面那道题很像,改成k次循环而不是二次就好了。

跟官方题解的方法不一样,懒得看了。

class Solution {
    public int maxProfit(int k, int[] prices) {
        int[][] arr = new int[k+1][2];//k次买入卖出
        for(int i = 0 ; i <= k; i++){
            arr[i][0] = -prices[0];//buy初始化
            arr[i][1] = 0;//当天买入卖出
        }
        int len = prices.length;
        for(int i = 0; i < len; i++){
            for(int j = 1; j <= k ; j++){
                arr[j][0] = Math.max(arr[j][0], arr[j-1][1] - prices[i]);//等于上一次arr[j][1]剩下的前减价格
                arr[j][1] = Math.max(arr[j][1], arr[j][0] + prices[i]);
            }
        }
        return arr[k][1];
    }
}

309.买卖股票的最佳时机含冷冻期

. - 力扣(LeetCode)

自己的思路

感觉不太会做,只是把上面那道题的k定成了len,并且修改了dp[i][0]的转移公式,如果我要买,我得买两天之前的。

但是答案是错误的,看看是不是初始化有问题。

class Solution {
    public int maxProfit(int[] prices) {
        int len = prices.length;
        int[][] dp = new int[len+1][2];
        for(int i = 0; i <= len; i++){
            dp[i][0] = -prices[0];
            dp[i][1] = 0;
        }
        //那就当作买卖k次
        for(int i = 2; i <= len; i++){
            dp[i][0] = Math.max(dp[i][0] , dp[i-2][1] - prices[i-1]);//买或者不买
            dp[i][1] = Math.max(dp[i][1], dp[i][0] + prices[i-1]);//表示利润的和,用加来表示
        }
        return dp[len][1];
        
    }
}

官方题解

妙啊,既然买入卖出是两个状态,那完全可以把冷冻期也作为一个状态。

理解三个状态

f[i][0]: 手上持有股票的最大收益
f[i][1]: 手上不持有股票,并且处于冷冻期中的累计最大收益
f[i][2]: 手上不持有股票,并且不在冷冻期中的累计最大收益

官方代码题解

class Solution {
    public int maxProfit(int[] prices) {
        int len = prices.length;
        int[][] dp = new int[len][3];
        dp[0][0] = -prices[0];
        for(int i = 1; i < len; i++){
            dp[i][0] = Math.max(dp[i-1][0], dp[i-1][2] - prices[i]);//持有股票的最大利润
            dp[i][1] = dp[i-1][0] + prices[i];//今天卖出票,冷冻期,不考虑当天买入卖出,持有股票的最大利润
            dp[i][2] = Math.max(dp[i-1][1], dp[i-1][2]);//前一天是冷冻期或者不是冷冻期,反正前一天不可能持有股票,那是冷冻期的事
        }
        return Math.max(dp[len-1][2], dp[len-1][1]);//最后要注意比较,因为当天卖出的可能还没有传给最后的
    }
}

收获

dp数组的设置
f[i][0]: 手上持有股票的最大收益
f[i][1]: 手上不持有股票,并且处于冷冻期中的累计最大收益
f[i][2]: 手上不持有股票,并且不在冷冻期中的累计最大收益
int[][] f = new int[n][3];
f[0][0] = -prices[0];

遍历方式

为什么这道题跟上一题的遍历方式不一样,没有将次数记录在状态里,只是在遍历n个股票,尝试找出最大的收益。

上一题要求的是恰好k次交易,所以需要记录交易次数。

递归方程
dp[i][0]

dp[i][0]表示在前i个股票中,手中持有股票的最大利润。

它的转移方程为持有前一天的股票,或者当天自己买入(原始钱是前一天的最大利润,很好理解,要持有股票的最大利润,就是拿前一天的最大利润买今天的)。即

dp[i][0] = Math.max(dp[i-1][0], dp[i-1][2] - prices[i]);

 

 dp[i][1]

dp[i][1]表示在前i个股票中,手中不持有股票的处于冷冻期的最大收益。

这个的转移比较难理解,多看。

手中不持有股票的冷冻期,意味着我前一天要卖出,不过前一天卖出的利益并不是最大利润,所以直接用前一天持有股票的最大利润减去前一天的股票价格,而不是继承。

  • 为什么冷冻期是前一天的持有股票时的利润加今天卖出的股票价钱,不是加昨天的最大价钱,如果我当天是冷冻期的话,不是应该是昨天卖出的吗。

 这里我们需要将冷冻期理解为卖出当天开始,为什么呢

  • 之前的题目是可以多次在当天买入卖出的,但是在这道题,当天卖出了之后不能再买入了,所以可以理解为,这道题在当天卖出的时候就是冷冻期了,包括后面的第一天也是冷冻期。

所以dp[i][1] = dp[i-1][0] + price[i].

而由于当天不卖出的冷冻期,不需要对股票做任何操作

 

dp[i][2]

dp[i][2]表示在前i个股票,手中不持有股票的不处于冷冻期的最大收益。

不持有股票又不是冷冻期,意味着前一天是冷冻期或者前一天是冷冻期之后的日子,而当天是无法堆股票做任何操作的,所以只需要继承前两天的冷冻期或者非冷冻期的最大利润就可以了。


714.买卖股票的最佳时机含手续费

. - 力扣(LeetCode)

自己的思路

和无手续费的时候其实是一样的,只需要在收入减去费用就可以了,卖出和买入的时候的减费用都行。

跟官方题解没区别,过。

class Solution {
    public int maxProfit(int[] prices, int fee) {
        //一个普通的dp数组而已,只不过在卖出的时候减个交易费就好
        int len = prices.length;
        int[][] dp = new int[len][2];
        dp[0][0] = -prices[0];
        for(int i = 1 ; i < len; 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][0] + prices[i] - fee);
        }
        return dp[len-1][1];
    }
} 

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

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

相关文章

文心智能体——制作你的专属AI

随着社会的进步和互联网技术的发展&#xff0c;人工智能领域正蓬勃发展。最近几年关于人工智能的新闻日渐增多并且成为了当代最大的热点&#xff0c;所有的领域都在引进AI、训练AI、使用AI&#xff0c;AI正逐步融入人们的生活。从前几年chatGPT大语言模型的横空出世&#xff0c…

【CSDN入门级教程】

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Linux进程调度和进程切换

并行&#xff08;Parallel&#xff09; 含义&#xff1a;并行是指多个任务在同一时刻同时执行。 硬件要求&#xff1a;需要多个处理器&#xff08;如多核CPU&#xff09;或者多台计算设备来实现&#xff0c;这些执行单元能够真正地同时处理不同的任务。例如&#xff0c;一个具…

vite学习教程05、vite+vue2构建本地 SVG 图标

文章目录 前言一、构建本地SVG图标详细步骤1、安装开发依赖2、配置vite2.1、配置vite.config.js2.2、封装vite引入插件脚本 解决报错&#xff1a;can not find package fast-glob imported 二、实际应用应用1&#xff1a;未封装&#xff0c;直接vue应用应用2&#xff1a;封装vu…

Self-Operating Computer:基于PyAutoGui加AI实现无人“驾驶“电脑,让Python带你走近未来世界

近年来&#xff0c;AI 领域不断取得突破&#xff0c;特别是多模态模型的出现&#xff0c;为计算机无人操控带来了全新的可能性。 想象一下&#xff0c;你的电脑不再需要你手动操作&#xff0c;而是可以像人一样&#xff0c;理解你的指令&#xff0c;并自动执行一系列鼠标键盘操…

【word脚注】双栏设置word脚注,脚注仅位于左栏,右栏不留白

【word脚注】双栏设置word脚注&#xff0c;脚注仅位于左栏&#xff0c;右栏不留白 调整前效果解决方法调整后效果参考文献 调整前效果 调整前&#xff1a;脚注位于左下角&#xff0c;但右栏与左栏内容对其&#xff0c;未填充右下角的空白区域 解决方法 备份源文件复制脚注内…

MySQL--聚合查询、联合查询、子查询、合并查询(上万字超详解!!!)

目录 一、前言二、聚合查询2.1 聚合函数2.1.1 COUNT():统计所有行2.1.2 SUM(列名) 求和2.1.3 AVG()2.1.4 MAX()、MIN() 2.2 GROUP BY子句&#xff08;分组查询&#xff09;2.3 HAVING 三、联合查询3.1表的笛卡儿积3.2内连接3.2.1 例题一3.2.2 例题二 3.3外连接3.3.1 右外连接3.…

【每天学个新注解】Day 16 Lombok注解简解(十五)—@FieldNameConstants

FieldNameConstants 根据属性名生成常量类的常量。 1、如何使用 加在需要根据属性名生成常量的属性上。 2、代码示例 例&#xff1a; FieldNameConstants public class Test {private String iAmAField;private int andSoAmI;FieldNameConstants.Exclude private int asA…

Microsoft AI部门的CEO额备忘录

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

kafka-windows集群部署

kafka-windows集群部署目录 文章目录 kafka-windows集群部署目录前言一、复制出来四个kafka文件夹二、修改集群每个kafka的配置文件四、启动zookeeper&#xff0c;kafka集群 前言 部署本文步骤可以先阅读这一篇博客&#xff0c;这篇是关于单机kafka部署测试的。本文用到的文件…

VUE2常见问题以及解决方案汇总(不断更新中)

解决vue项目中 el-table 的 row-click 事件与行内点击事件冲突&#xff0c;点击事件不生效&#xff08;表格行点击事件和行内元素点击事件冲突&#xff09;需要阻止事件冒泡 问题描述 1.点击列的编辑按钮&#xff0c;会触发按钮本身事件&#xff0c;同时会触发行点击事件 2.点…

自用Proteus(8.15)常用元器件图示和功能介绍(持续更新...)

文章目录 一、 前言二、新建工程&#xff08;以51单片机流水灯为例&#xff09;2.1 打开软件2.2 建立新工程2.3 创建原理图2.4 不创建PCB布版设计2.5 创建成功2.6 添加元器件2.7 原理图放置完成2.8 编写程序&#xff0c;进行仿真2.9 仿真 三、常用元器件图示和功能介绍3.1 元件…

春秋云镜靶场之CVE-2022-28525

1.环境搭建 我们开启环境 可以看到题目提示我们是文件上传漏洞&#xff0c;那么我们就进行测试 2.开启环境 我们开启环境&#xff0c;可以看到是一个登录页面&#xff0c;登录页面:一种是弱口令&#xff0c;一种是自己进行注册&#xff0c;一种是SQL注入&#xff0c;一种是在…

【rCore OS 开源操作系统】Rust 异常处理

【rCore OS 开源操作系统】Rust 异常处理 前言 虽然人还在旅游ing&#xff0c;但是学习不能停止&#xff0c;所以还是写点博客记录下。 对于 Rust 的异常处理&#xff0c;我的感受是&#xff1a;晦涩难懂&#xff0c;繁琐难记。 但是没办法&#xff0c;正如一位故人所说的&…

算法 | 位运算(哈希思想)

位运算 &与两个位都为1时&#xff0c;结果才为1&#xff08;有0为0&#xff09;|或两个位都为0时&#xff0c;结果才为0&#xff08;有1为1&#xff09;^异或两个位相同为0&#xff0c;相异为1~取反0变1&#xff0c;1变0<<左移各二进位全部左移若干位&#xff0c;高…

【FPGA开发】Modelsim如何给信号分组

前面已经发布过了一篇关于 Modelsim 的入门使用教程&#xff0c;针对的基本是只有一个源文件加一个仿真tb文件的情况&#xff0c;而实际的工程应用中&#xff0c;往往是顶层加多个底层的源文件结构&#xff0c;如果不对信号进行一定的分组&#xff0c;就会显得杂乱不堪&#xf…

LSM6DSV16X基于MLC智能笔动作识别(4)----中断获取智能笔状态

LSM6DSV16X基于MLC智能笔动作识别.4--中断获取智能笔状态 概述视频教学样品申请源码下载硬件准备开启INT中断参考驱动程序配置中断主程序演示 概述 LSM6DSV16X 支持通过中断&#xff08;INT&#xff09;输出 MLC&#xff08;机器学习核&#xff09;识别的动作。具体来说&#…

YOLOv8改进线性注意力模块 ICCV2023 FLatten Transformer

1,原理部分 论文地址:2308.00442 (arxiv.org) 在将 Transformer 模型应用于视觉任务时,自我注意的二次计算复杂性一直是一个持续的挑战。另一方面,线性注意力通过精心设计的映射函数近似 Softmax 操作,通过其线性复杂性提供了一种更有效的替代方案。然而,当前的线性注意…

手机sd卡数据被清空怎么恢复原状?高效、可行的恢复策略

在数字化时代&#xff0c;手机SD卡作为我们存储重要数据的“数字仓库”&#xff0c;其安全性与稳定性直接关系到我们日常生活的便捷与信息安全。然而&#xff0c;不慎操作或系统故障导致的SD卡数据清空&#xff0c;常常让人措手不及&#xff0c;焦虑万分。面对这一挑战&#xf…

@antv/x6 导出图片下载,或者导出图片为base64由后端去处理。

1、导出为文件的格式&#xff0c;比如 PNG graph.exportPNG(function (dataURL) {console.log(dataURL);let img document.getElementById(img) as HTMLImageElement;img.src dataURL;},{backgroundColor: #fff,padding: [20, 20, 20, 20],quality: 1,width: graph.options.w…