剑指 Offer 63. 股票的最大利润 + 动态规划
剑指 Offer 63. 股票的最大利润
Offer_63
题目描述
方法一:暴力法
package com.walegarrett.offer;
/**
* @Author WaleGarrett
* @Date 2021/2/13 23:29
*/
import java.util.Arrays;
/**
* 题目详情:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
*/
/**
* 方法一:暴力法
*/
public class Offer_63 {
public int maxProfit(int[] prices) {
int len = prices.length;
int maxProfit = 0;
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
maxProfit = Math.max(maxProfit, prices[j] - prices[i]);
}
}
return maxProfit;
}
}
方法二:动态规划
/**
* 方法二:动态规划法
*/
class Offer_63_2 {
public int maxProfit(int[] prices) {
if(prices == null || prices.length == 0)
return 0;
int len = prices.length;
int maxProfit = 0;
int[] dp = new int[len];
dp[0] = 0;//第0天的最大理论为0
int minMon = prices[0];
for(int i=1;i<len;i++){
dp[i] = Math.max(dp[i-1], prices[i]-Math.min(minMon, prices[i]));
minMon = Math.min(minMon, prices[i]);
}
return dp[len-1];
}
}
空间复杂度优化
/**
* 空间复杂度优化
*/
class Offer_63_3 {
public int maxProfit(int[] prices) {
if(prices == null || prices.length == 0)
return 0;
int len = prices.length;
int maxProfit = 0;
int minMon = prices[0];
for(int i=1;i<len;i++){
maxProfit = Math.max(maxProfit, prices[i]-Math.min(minMon, prices[i]));
minMon = Math.min(minMon, prices[i]);
}
return maxProfit;
}
}
Either Excellent or Rusty