思路一
暴力解法,超时,计算两者之间的距离
class Solution {
public int maxProfit(int[] prices) {
// 暴力方法
int res = 0;
for(int i = 0;i < prices.length -1;i++){
for(int j = i + 1;j < prices.length;j++){
res = Math.max(res,prices[j] - prices[i]);
}
}
return res;
}
}
思路二:动态规划
class Solution {
public int maxProfit(int[] prices) {
// 定义两种状态,一种是持有这个的状态,一种是不持有的状态
if(prices.length == 0) return 0;
int[][] dp = new int[prices.length][2];
dp[0][0] = - prices[0];
dp[0][1] = 0;
// dp动态规划公式 dp[i][0] = Math.max(dp[i-1][0],)
// 如果持有的话,有两种情况
// 1.第i-1天持有
// 2. 第i天开始买入
for(int i = 1; i < prices.length;i++){
dp[i][0] = Math.max(dp[i-1][0],-prices[i]);
// 不持有的状态有两种
// 1.第i-1天不持有
// 2.第i-1天持有,然后第i天卖出
dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0] + prices[i]);
}
return Math.max(dp[prices.length - 1][0],dp[prices.length - 1][1]);
}
}
思路三:贪心
class Solution {
public int maxProfit(int[] prices) {
// 使用贪心的方法,最左最小值,最优最大值
int lens = Integer.MAX_VALUE;
int res = 0;
for(int i = 0;i < prices.length;i++){
lens = Math.min(lens,prices[i]);
res = Math.max(res, prices[i] - lens);
}
return res;
}
}
class Solution {
public int maxProfit(int[] prices) {
int res = 0;
for(int i = 1; i < prices.length ;i ++){
res += Math.max(prices[i] - prices[i - 1],0);
}
return res;
}
}
class Solution {
public int maxProfit(int[] prices) {
//dp[i][0] 表示持有的股票的最大值 dp[i][1] 表示不持有股票的最大值
if(prices.length == 0) return 0;
int[][] dp = new int[prices.length][2];
dp[0][0] = - prices[0];
dp[0][1] = 0;
// dp动态规划公式 dp[i][0] = Math.max(dp[i-1][0],)
// 如果持有的话,有两种情况
// 1.第i-1天持有
// 2. 第i天开始买入
// int [] maxValue = new int[prices.length];
int maxValue = 0;
for(int i = 1; i < prices.length;i++){
dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1] - prices[i]);
// 不持有的状态有两种
// 1.第i-1天不持有
// 2.第i-1天持有,然后第i天卖出
dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0] + prices[i]);
// maxValue
}
return Math.max(dp[prices.length - 1][0],dp[prices.length - 1][1]);
}
}