#yyds干货盘点# 动态规划专题:买卖股票的最好时机

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点# 动态规划专题:买卖股票的最好时机相关的知识,希望对你有一定的参考价值。

1.简述:

描述

假设你有一个数组prices,长度为n,其中prices[i]是某只股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益

1. 你可以多次买卖该只股票,但是再次购买前必须卖出之前的股票

2. 如果不能获取收益,请返回0

3. 假设买入卖出均无手续费

数据范围: #yyds干货盘点# , #yyds干货盘点#

要求:空间复杂度 #yyds干货盘点#,时间复杂度 #yyds干货盘点#

进阶:空间复杂度 #yyds干货盘点#,时间复杂度 #yyds干货盘点#

输入描述:

第一行输入一个正整数 n ,表示数组 prices 的长度

第二行输入 n 个正整数,表示数组中prices的值

输出描述:

输出最大收益

示例1

输入:

7
8 9 2 5 4 7 1

输出:

7

说明:

在第1天(股票价格=8)买入,第2天(股票价格=9)卖出,获利9-8=1
在第3天(股票价格=2)买入,第4天(股票价格=5)卖出,获利5-2=3
在第5天(股票价格=4)买入,第6天(股票价格=7)卖出,获利7-4=3
总获利1+3+3=7,返回7
示例2

输入:

5
5 4 3 2 1

输出:

0

说明:

由于每天股票都在跌,因此不进行任何交易最优。最大收益为0。
示例3

输入:

5
1 2 3 4 5

输出:

4

说明:

第一天买进,最后一天卖出最优。中间的当天买进当天卖出不影响最终结果。最大收益为4。

2.代码实现:

import java.util.*;

public class Main
public static void main(String[] args)
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] prices = new int[n];
for ( int i=0;i<n;i++)
prices[i] = sc.nextInt();

int[][] dp = new int[n][2]; //可以理解为利润
dp[0][0] = -prices[0]; //第一天买入
dp[0][1] = 0; //第一天卖出
for ( int i=1; i<n; i++)
//第i天买入的最佳策略是比较前一天买入或者前一天卖出现在买入的比较
dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1]-prices[i]);
//第i天卖出的最佳策略是比较前一天买入现在卖出的利润或者前一天空仓的比较
dp[i][1] = Math.max(dp[i-1][0]+prices[i],dp[i-1][1]);

System.out.println(dp[n-1][1]);


以上是关于#yyds干货盘点# 动态规划专题:买卖股票的最好时机的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点# 面试必刷TOP101:买卖股票的最好时机

#yyds干货盘点# 动态规划专题:数位染色

#yyds干货盘点# 动态规划专题:信封嵌套

#yyds干货盘点# 动态规划专题:装箱问题

#yyds干货盘点# 动态规划专题:小红取数

#yyds干货盘点# 动态规划专题:跳跃游戏