动态规划
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/