题目:
给定一个数组 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的情况。
标签:java,python,力扣,int,prices,return,minprice,dp,利润 From: https://www.cnblogs.com/liu-myu/p/16815462.html