买卖股票的最佳时机 I II III IV

news2024/11/23 3:44:17

121. 买卖股票的最佳时机

在这里插入图片描述

自己的思路:采用求最长连续子串和题目的思路

class Solution {
    public int maxProfit(int[] prices) {
        if(prices.length == 1) return 0;
        int[] nums = new int[prices.length - 1];
        for(int i = 0;i < prices.length - 1;i++){
            nums[i] = prices[i + 1] - prices[i];
        }
        int[] dp = new int[prices.length - 1];
        dp[0] = nums[0];
        int res = nums[0];
        for(int i = 1;i < dp.length;i++){
            dp[i] = Math.max(dp[i-1] + nums[i],nums[i]);
            res = Math.max(dp[i],res);
        }
        return res < 0 ? 0:res;
    }
}

在这里插入图片描述
贪心思路:

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

在这里插入图片描述
在这里插入图片描述
dp[i][0] dp[i][1] 表示第i天持有股票所得最多现金.
持有股票dp[i][0]:
1.之前就持有股票dp[i - 1][0]
2.现在刚持有也就是买入股票-prices[i]
不持有股票dp[i][1]:
1.之前就不持有股票dp[i - 1][1]
2.现在刚不持有也就是卖掉股票dp[i - 1][0] + prices[i]

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

在这里插入图片描述
优化空间复杂度,不需要那么长的数组只需要两块。

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

在这里插入图片描述

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

在这里插入图片描述
贪心算法:

class Solution {
    public int maxProfit(int[] prices) {
        if(prices.length == 1) return 0;
        int[] nums = new int[prices.length - 1];
        for(int i = 0;i < prices.length - 1;i++){
            nums[i] = prices[i + 1] - prices[i];
        }
        int result = 0;
         for(int i = 0;i < nums.length;i++){
             if(nums[i] > 0){
                 result += nums[i];
             }
         }
        return result;
    }
}

在这里插入图片描述
而本题,因为一只股票可以买卖多次,所以当第i天买入股票的时候,所持有的现金可能有之前买卖过的利润。

那么第i天持有股票即dp[i][0],如果是第i天买入股票,所得现金就是昨天不持有股票的所得现金 减去 今天的股票价格 即:dp[i - 1][1] - prices[i]。
dp[i-1][1] - price[i]是之前之前买卖过的利润 再减去当前买入

// 优化空间
class Solution {
    public int maxProfit(int[] prices) {
        int[] dp = new int[2];
        // 0表示持有,1表示卖出
        dp[0] = -prices[0];
        dp[1] = 0;
        for(int i = 1; i <= prices.length; i++){
            // 前一天持有; 既然不限制交易次数,那么再次买股票时,要加上之前的收益
            //与上一题唯一不同点
            dp[0] = Math.max(dp[0], dp[1] - prices[i-1]);
            // 前一天卖出; 或当天卖出,当天卖出,得先持有
            dp[1] = Math.max(dp[1], dp[0] + prices[i-1]);
        }
        return dp[1];
    }
}

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述
和上一题思路一致

class Solution {
    public int maxProfit(int k, int[] prices) {
        int[] dp = new int[2*k + 1];
        for(int i = 0;i < 2*k + 1;i++){
            if(i % 2 == 1){
                dp[i] = -prices[0];
            }
        }
        for(int i = 0;i < prices.length;i++){
            for(int j = 1;j < 2*k+1;j++){
                int temp = j % 2 == 1?-prices[i]:prices[i];
                dp[j] = Math.max(dp[j],dp[j-1]+temp);
            }
        }
        return dp[2*k];
    }
}

在这里插入图片描述

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

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

相关文章

C++STL详解(六)——stack和queue

文章目录空间适配器stackstack的定义方式stack的使用stack的模拟实现queuequeue的定义方式queue的使用queue的模拟实现空间适配器 适配器是一种设计模式&#xff08;设计模式是一套被反复使用的&#xff0c;多数人知晓的&#xff0c;经过分类编目的&#xff0c;代码设计经验的…

Linux下Docker安装mysql-超详细步骤

安装Docker Engine官方参考文档&#xff1a;https://docs.docker.com/engine/install/centos/若之前有安装docker&#xff0c;需要先卸载之前的dockersudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \d…

css实现画面转场以及边框线条动画

效果预览 在实现转场效果之前&#xff0c;需要先了解css的clip-path属性&#xff0c;该属性就是实现转场的核心属性&#xff0c;clip-path属性可以使用裁剪方式创建元素的可显示区域。区域内的部分显示&#xff0c;区域外的隐藏。也就是说裁切的大小不会超过实际的大小&#x…

测牛学堂:接口测试基础理论和工具的使用

接口测试流程总结 1 需求分析&#xff0c;看产品经理的需求文档 2 接口文档解析&#xff0c;开发编写的api接口文档 3 设计测试用例 4脚本开发 5 执行及缺陷跟踪 6 生成测试报告 7接口自动化持续集成 测试解析接口文档 接口文档&#xff0c;又称为api文档&#xff0c;是由后…

SpringCloud-高级篇(二)

目录&#xff1a; &#xff08;1&#xff09;限流规格-流控模式 入门案例&#xff1a;直接模式 关联模式&#xff1a; 链路模式&#xff1a; &#xff08;2&#xff09; 流控效果&#xff1a;warm up 排队等待&#xff1a; &#xff08;3&#xff09;热点参数限流&#xff1…

tar和gzip压缩和解压

打包和压缩的区别&#xff1a;打包&#xff1a;将多文件 封装在一起压缩&#xff1a;将多文件 封装在一起 通过特定的算法 将冗余的数据 进行删除tar默认是打包命令&#xff0c;如果想用tar进行压缩 必须加选项1、gzip格式压缩&#xff1a;tar zcvf 压缩包包名 文件1 文件2 文件…

Java集合进阶(三)

文章目录一、Map1. 概述2. 基本功能3. 遍历4. 遍历学生对象5. 集合嵌套6. 统计字符出现次数二、Collections1. 常用方法2. 学生对象排序三、模拟斗地主一、Map 1. 概述 Interface Map<K, V>&#xff1a;K 是键的类型&#xff0c;V 是值的类型。 将键映射到值的对象&…

Redis高频面试题汇总(下)

目录 1.Redis中什么是Big Key(大key) 2.Big Key会导致什么问题 3.如何发现 bigkey&#xff1f; 4.为什么redis生产环境慎用keys *命令 5.如何处理大量 key 集中过期问题 6.使用批量操作减少网络传输 7.缓存穿透 8.缓存击穿 9.缓存雪崩 10.缓存污染&#xff08;或满了…

20230311英语学习

Philosophy of Food: Guidelines for an Authentic Approach to Eating 饮食哲学&#xff1a;值得思考的问题 Whats Philosophical About Food? Philosophy of food finds its basis on the idea that food is a mirror.Eating mirrors the making of a self, that is, the …

vue3.js的介绍

一.vue.js简述 Vue是一套用于构建用户开源的MVVM结构的Javascript渐进式框架&#xff0c;尤雨溪在2015年10月27日发布了vue.js 1.0Eavangelion版本&#xff0c;在2016年9月30日发布了2.0Ghost in the Shell版本&#xff0c;目前项目由官方负责 vue的核心只关注图层&#xff0…

BERT: Pre-training of Deep Bidirectional Transformers forLanguage Understanding

参考BERT原文[1810.04805] BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding (arxiv.org)【(强推)李宏毅2021/2022春机器学习课程】 https://www.bilibili.com/video/BV1Wv411h7kN/?p73&share_sourcecopy_web&vd_source30e93e9c70e…

CNN神经网络——手写体识别

目录 Load The Datesets Defining,Training,Measuring CNN Algorithm Datasets GRAET HONOR TO SHARE MY KNOWLEDGE WITH YOU This paper is going to show how to use keras to relize a CNN model for digits classfication Load The Datesets The datasets files are …

便携式井用自动采样器主要有哪些功能特点?

如图此款井用采样器整机小巧&#xff0c;非常适合狭小领域使用&#xff0c;携带方便&#xff0c;采样精准&#xff0c;可以延伸放到井下进行工作。尤其适合&#xff1a;窨井、下水道、沟渠 等现场条件恶劣的工作场合。可帮助采样人员采取到具有代表性的水样从而进行检测 参数特…

笔记本固态盘数据丢失怎么办?笔记本固态盘怎么恢复数据

如果笔记本固态盘数据丢失怎么办&#xff1f;笔记本固态盘怎么恢复数据&#xff1f;下面将为大家详细地介绍一下笔记本固态硬盘数据恢复的三种实用方法&#xff0c;希望对大家有所帮助。一、简单恢复方法笔记本固态硬盘数据删除以后&#xff0c;较为简单直接的恢复方法就是从回…

《C++代码分析》第三回:类成员函数覆盖父类函数的调用(分析this指针的变化)

一、前言 在C的学习中我们知道&#xff0c;子类是可以覆盖父类的方法&#xff0c;这里我们探讨一下子类方法调用父类方法时this指针时如何变化的。 二、示例代码 #include "windows.h" #include "windef.h" #include <iostream> #include <tch…

自学大数据第六天~HDFS命令

HDFS常用命令 查看hadoop版本 version hadoop version注意,没有 ‘-’ [hadoopmaster ~]$ hadoop version Hadoop 3.3.4 Source code repository https://github.com/apache/hadoop.git -r a585a73c3e02ac62350c136643a5e7f6095a3dbb Compiled by stevel on 2022-07-29T12:3…

蓝桥杯嵌入式(G4系列):定时器输出可调PWM

前言&#xff1a; 蓝桥杯定时器输出PWM的考点在历届真题中的出现次数较多&#xff0c;而且之前关于STM32的学习&#xff0c;我对于使用STM32Cubemx配置PWM的方式确实不是很熟悉&#xff0c;这里简单记录一下自己的学习过程。 STM32Cubemx配置部分&#xff1a; 这里我们是改编真…

yocto编译烧录和脚本解析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、初始化构建目录二、imx-setup-release.sh脚本解析三、编译单独编译内核四、烧录总结前言 本篇文章主要讲解如何在下载好源码之后进行编译和yocto的脚本解析…

剑指 Offer II 027. 回文链表

题目链接 剑指 Offer II 027. 回文链表 easy 题目描述 给定一个链表的 头节点 head&#xff0c;请判断其是否为回文链表。 如果一个链表是回文&#xff0c;那么链表节点序列从前往后看和从后往前看是相同的。 示例 1&#xff1a; 输入: head [1,2,3,3,2,1] 输出: true 示例…

多目标遗传算法NSGA-II原理详解及算法实现

在接触学习多目标优化的问题上&#xff0c;经常会被提及到多目标遗传算法NSGA-II&#xff0c;网上也看到了很多人对该算法的总结&#xff0c;但真正讲解明白的以及配套用算法实现的文章很少&#xff0c;这里也对该算法进行一次详解与总结。会有侧重点的阐述&#xff0c;不会针对…