买卖股票系列(力扣121、122、123、188、309、714) Java动态规划
创始人
2024-02-05 09:22:31
0

一、买卖股票的最佳时机(力扣121)

        121. 买卖股票的最佳时机-力扣

        使用两个变量,一个变量max来保存截止到当天获得的最大利润,另一个变量min来保存截止到当天股票的最小价格,动态规划即可求出所有的当天价格中,最大的价格

class Solution {public int maxProfit(int[] prices) {int min = prices[0];    //截止到当天,股票的最小价格int max = 0;            //截止到当天,买卖股票能获得的最佳利润for(int i=1; i

 

二、买卖股票的最佳时机 II(力扣122)

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

        2.1 贪心

        等价于每天都交易,只要是赚钱的就卖。(比如股票价格为2,3,4。2块钱买进,4块钱卖出 等价于 2块钱买3块钱卖,3块钱买4块钱卖) 

class Solution {public int maxProfit(int[] prices) {int res = 0;    //利润总和for(int i=1; i 0) {  //如果是赚钱的就卖res += temp;}}return res;}
}

        2.2 动态规划

        和下面的三一样的思路 :

class Solution {public int maxProfit(int[] prices) {int a = 0 - prices[0];  //持有股票的状态int b = 0;              //不持有股票的状态for(int i=0; i

 

三、最佳买卖股票时机含冷冻期(力扣309) 

        309. 最佳买卖股票时机含冷冻期-力扣 

        3.1 动态规划

         一天有三种状态:持有股票、处于冷冻期、无股票也不在冷冻期

        我们使用dp[i][]数组来表示第i天各种状态下的最大利润,

  • dp[i][0]        表示持有股票
  • dp[i][1]        表示不持有股票,在冷冻期(表示当天结束后处于冷冻期,即当天卖出了股票)
  • dp[i][2]        表示不持有股票,不在冷冻期

        那么,dp[i][0]的值取决于:因为当天持有股票,那么有两种情况:1、是之前一直持有的,此时i-1天必须持有股票,则值为dp[i-1][0];2、是当天刚买的,那么前一天不能持有股票,也不能再冷冻期,只可能是2状态,再扣去买股票的钱,则值为dp[i-1][2] - prices[i]。则:

                                dp[i][0] = max{ dp[i-1][0] , dp[i-1][2] - prices[i] }

        dp[i][1]的值取决于:因为dp[i][1]表示当天结束后处于冷冻期,即当天卖出了股票,则前一天必须持有股票,那么只要一种情况,即 dp[i-1] + prices[i]

        dp[i][2]的值取决于:因为当天既不持有股票,也不在冷冻期,说明前一天不持有股票,可能在冷冻期也可能不在,那么有两种情况:1、前一天在冷冻期,那么当天值为dp[i-1][1];2、前一天不在冷冻期,那么当天值为dp[i-1][2]。则:

                                dp[i][2] = max{ dp[i-1][1] , dp[i-1][2] }

        那么我们所求的是什么值呢?因为要想利润最大,最后一天必然不可能持有股票,所以我们要求的是    max{ dp[len-1][1] , dp[len-1][2] }

class Solution {public int maxProfit(int[] prices) {int len = prices.length;int [][]dp = new int[len][3];dp[0][0] = 0 - prices[0];dp[0][1] = 0;dp[0][2] = 0;for(int i=1; i

        3.2 优化空间

        其实当天的状态只与前一天有关,那么我们只用变量保存即可。 

class Solution {public int maxProfit(int[] prices) {int len = prices.length;int a = 0 - prices[0];int b = 0;int c = 0;for(int i=1; i

 

四、买卖股票的最佳时机含手续费 (力扣714)

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

        因为每次交易有手续费,就不能像2.1那样做了,但是2.2的做法是通用做法,只要在卖出股票的时候把手续费减掉就行。 

class Solution {public int maxProfit(int[] prices, int fee) {int a = 0 - prices[0];  //持有股票的状态int b = 0;              //不持有股票的状态for(int i=0; i

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...