题目:

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

 

示例 1:

输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
 

提示:

1 <= prices.length <= 105
0 <= prices[i] <= 104

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

动态规划:

动态规划做题步骤:

1.明确dp[i]所代表的含义?(二维dp[i][i])

2.根据dp[i]和dp[i-1]的关系得到状态转移方程;

3.确定初始条件dp[0]。

所以这道题买卖股票的最佳时机是由之前买或者不买的状态决定的,而之前的状态又由它之前的状态决定的,dp[i]代表前 i 天的最大利润,所以状态转移方程为dp[i] = max(dp[i-1], prices[i] – minprices)

java代码:

 1 class Solution {
 2     public int maxProfit(int[] prices) {
 3         int n = prices.length;
 4         int[] dp = new int[n];
 5         //dp数组初始化
 6         dp[0] = 0;
 7         //设定初始最低价格就为第一个价格
 8         int minprice = prices[0];
 9         for(int i = 1; i < n; i++){
10             dp[i] = Math.max(dp[i-1], prices[i] - minprice);
11             minprice = Math.min(minprice, prices[i]);
12         }
13         return dp[n - 1];
14     }
15 }

 python3代码:

1 class Solution:
2     def maxProfit(self, prices: List[int]) -> int:
3         n = len(prices)
4         dp = [0] * n
5         minprice = prices[0]
6         for i in range(1, n):
7             dp[i] = max(dp[i -1], prices[i] - minprice)
8             minprice = min(minprice, prices[i])
9         return dp[-1]

 解释:

① dp = [0] * n:浅拷贝,也就是把一个列表重复了n次,例如dp = [0] * 4结果为dp = [0,0,0,0]

     区别:[0 for _ in range(n)] :这是深拷贝,创建。

②最后返回的是dp[-1]:在python语法中,[-1]代表的是最后一个元素,如果写成dp[n],就会导致越界,数组的最大下标为n-1。

③可以省略 if n == 0: return 0,因为题目中已经明确prices.length是大于等于1的,并不会存在长度为0的情况。

原文地址:http://www.cnblogs.com/liu-myu/p/16815462.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性