题解 | #买卖股票的最好时机(一)#
买卖股票的最好时机(一)
https://www.nowcoder.com/practice/64b4262d4e6d4f6181cd45446a5821ec
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param prices int整型vector * @return int整型 */ int maxProfit(vector<int>& prices) { // write code here if(prices.size()<2){ return 0; } if(prices.size()==2&&prices[1]-prices[0]<0){ return 0; } vector<int> dp(prices.size()+1); dp[0]=0; dp[1]=prices[1]-prices[0]; int min_price=prices[0]; for(int i=1;i<prices.size();i++){ dp[i+1]=max(dp[i],prices[i]-min_price); min_price=min(min_price,prices[i]); } return dp[prices.size()]; } };
动态规划:假设第t天时,最大利润是m,第t+1天呢?我们需要考虑这多出来的一天是否需要操作,如果不需要操作那么最大利润还是m,如果需要操作,那么必然是t+1天卖出,那么怎么样使得利润最大,就是在1-t天内找一个最低min_price的买入。所以构建dp(prices.size+1); 第一天不能完成买卖各一次。第二天可以买卖一次,就是第一天买,第二天卖。就是第二天的价格-第一天的min_price所以min_price初始按第一天的算 int min_price=prices[0]; 那么第三天就是判断仍然保持第二天的操作还是第三天卖出 dp[i+1]=max(dp[i],prices[i]-min_price); ,在第1-2天选最小的买入。所以需要同步维持一个最小值min_prices. min_price=min(min_price,prices[i]); 按这个逻辑进行下去就可以找到整个t天的最大利润。此外有可能只有一天吗,那就是利润为0,当只有两天时,并且操作可以完成是亏本的,按题目所给条件,也是返回0;