前言
买卖股票最佳时机和最长子数组和类似。暴力算法和动态规划算法几乎如出一辙。一个是前序和小于零时重置当前值,一个是最小值小于当前值时重置为最小值。需关注重置的计算规则和标志。
买卖股票对应leetcode
. - 力扣(LeetCode)
实现原理
两次循环遍历,略暴力,会超时。固定i的位置,逐步移动j,计算i和j下标对应数据之差。
具体代码实现(暴力)
class Solution {public int maxProfit(int[] prices) {int res=0;for(int i=0;i<prices.length;i++){ for(int j=i+1;j<prices.length;j++){res=Math.max(prices[j]-prices[i],res);}}return res;}
}
QA1:能否进行时间优化?
动态规划
初始值:res为0,min=Integer.MAX_VALUE;
状态转移方程:
prices[i]<min,则min=Math.min(min,prices[i])
其他则:res=Math,max(prices[i]-min,res)
移动i的位置,发现最小值则存入最小值,然后比较后续的值与最小值之间的差值。
class Solution {//[7,8,1,5,3,6,4,0,]public int maxProfit(int[] prices) {int res=0;int min=Integer.MAX_VALUE;for(int i=0;i<prices.length;i++){if(prices[i]<min){min=Math.min(min,prices[i]);}else{res=Math.max(prices[i]-min,res);} }return res;}
}