题解 | #买卖股票的最好时机(二)#
买卖股票的最好时机(二)
https://www.nowcoder.com/practice/9e5e3c2603064829b0a0bbfca10594e9
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算最大收益 * @param prices int整型vector 股票每一天的价格 * @return int整型 */ int maxProfit(vector<int>& prices) { // write code here // 通过观察示例,发现一种思路 只要是递增的部分, 从头部那天买入 局部极大值卖出 可以作为一次收益 // 想起双指针 我先写了三指针的 但差一个样例 但又不能直接debug为何错误 // 看了官解二 我之前还是没想到最后最简单的版本 int n = prices.size(); if(n<2) { return 0; } int ans = 0; for(int i=1; i<n; ++i) { if(prices[i] > prices[i-1]) { ans += prices[i] - prices[i-1]; } } return ans; } }; class Solutionmy { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算最大收益 * @param prices int整型vector 股票每一天的价格 * @return int整型 */ int maxProfit(vector<int>& prices) { // write code here // 通过观察示例,发现一种思路 只要是递增的部分, 从头部那天买入 局部极大值卖出 可以作为一次收益 // 想起双指针 int n = prices.size(); if(n<2) { return 0; } else if(n==2) { if(prices[0]>=prices[1]) { return 0; } else { return prices[1]-prices[0]; } } int left=0, mid = 1, right = 2; int ans = 0; while(right<n) { while(prices[left]<=prices[mid] && prices[mid]<=prices[right] && right<n) { mid++; right++; } // 若不是递增 就分情况讨论 if(prices[mid]>prices[right] && prices[left]<=prices[mid] && right<n) { // 可以执行一轮计算 ans += (prices[mid] - prices[left]); left = right; //left +=2; mid = left +1; //mid += 2; right = mid+1; //right += 2; continue; } else if(prices[left] > prices[mid] && right<n) { left++; mid++; right++; } else if(right>=n) { ans += (prices[mid] - prices[left]); break; } } return ans; } };
我的在下面 有一个样例没通过