题解 | #买卖股票的最好时机(二)#
买卖股票的最好时机(二)
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;
}
};
我的在下面 有一个样例没通过