标签:买卖 int max 持有 121 最佳时机 Math prices dp
动态规划
class Solution {
public int maxProfit(int[] prices) {
/**
* 因为只能买一次,因此无法确定哪天买了还有每天的持股状态,需要定义一个二维数组分别存储持不持有该股票的利润
* dp[i][0]为第i天持有该股票的利润
* dp[i][1]为第i天不持有该股票的利润
*/
int[][] dp = new int[prices.length][2];
/**
* 第一天如果持有,说明第一天买了,利润是负的
* 第一天没买,利润是0
*/
dp[0][0] = -prices[0];
dp[0][1] = 0;
/**
* 对于第i天,如果持有,可能是前一天就持有了,或者是昨天没有今天买,二者取最大值(因为只能买一次,所以今天买的话本金肯定是0)
* 如果不持有,可能是昨天就不持有了,或者是昨天有今天卖,二者取最大值
*/
for (int i = 1; i < prices.length; i++) {
dp[i][0] = Math.max(dp[i - 1][0], -prices[i]);
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
}
/**
* 最后一天不持有,得到的就是最大利润
*/
return dp[prices.length - 1][1];
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(n)
*/
贪心
class Solution {
public int maxProfit(int[] prices) {
/**
* 记录整个数组中的最小价格
* 然后用所有的价格去减,得到最终的最大值
*/
int minPrice = Integer.MAX_VALUE;
int max = 0;
for (int i = 0; i < prices.length; i++) {
minPrice = Math.min(minPrice, prices[i]);
max = Math.max(max, prices[i] - minPrice);
}
return max;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/
标签:买卖,int,max,持有,121,最佳时机,Math,prices,dp 来源: https://www.cnblogs.com/taoyuann/p/15945178.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。