#121. 买卖股票的最佳时机
题目描述
解题思路
1、快乐暴力法
枚举所有可能买入和卖出的时机组合然后取最大值,通过题数+1
public static int maxProfit(int[] prices) {
int re = 0;
for (int i = 0; i < prices.length - 1; i++) {
for (int j = i+1; j < prices.length; j++) {
re = Math.max(re, prices[j] - prices[i]);
}
}
return re;
}
2、动态规划法
状态转移方程:dp[i+1] = Math.max(dp[i],prices[i+1]-min)
解释:遍历一次数组,记录当前最小值,然后更新状态数组
public static int maxProfit(int[] prices) {
int n = prices.length;
if(n == 0 || prices == null)
return 0;
int min = prices[0];
int[] dp = new int[n];
dp[0] = 0;
for (int i = 1; i < n; i++) {
min = Math.min(min, prices[i]);
dp[i] = Math.max(dp[i-1], prices[i] - min);
}
return dp[n-1];
}
因为每一次只用到了上次的一个数值,所以可以不用数组,压缩状态
o(n)->o(1)
public int maxProfit(int[] prices) {
int min = Integer.MAX_VALUE,lastmax = 0;
for (int num:prices) {
if(num < min)
min = num;
if(num - min > lastmax)
lastmax = num - min;
}
return lastmax;
}
很奇怪,非要写成这样才是执行时间1ms,如果像上面那样写就一直是2ms可能Math.max()效率比较低?