对比我的错误代码,有几个问题值得思考:
快慢指针一开始是必须差一还是可以相等?如果可以相等又为什么能相等?
这个题我没有考虑相等,就默认一开始两个数字不一样了,但是实际上按题意 fast对应的果树也可能是slow对应的果树,没有考虑实际问题,这也导致判断新树种的时候判断条件只考虑了fast对应的total[1],没有考虑slow对应的果树。
双指针就必须是slow++吗?slow还可以怎么移动?为什么能那么移动?
这个题是slow=fast-1,直接把slow移到一个很靠后的位置,然后再--,边界判断是亮点,判断条件也用的是slow-1(用的好!)而不是slow,这样就避免了--之后不等的情况,前一个满足条件的时候才--,而不是现在满足条件的时候--。
这个题解的亮点还在于充分利用“连续”的要求,一旦发现新树种就先保存一个原来的最大值之后就同时更新total数组,slow=fast-1的设定也考虑到了slow=原fast的情况。
最后return的时候也max了一下,因为最后fast++了。
正确代码:
class Solution {
public:
int totalFruit(vector<int>& fruits) {
int total[2]={fruits[0], fruits[0]};
int fast=0,slow=0;
int len=0;
while(fast<fruits.size())
{
if(fruits[fast]!=total[0] && fruits[fast]!=total[1])
{
len=max(fast-slow, len);
slow=fast-1;
total[0]=fruits[slow];
total[1]=fruits[fast];
while(slow>=1 && fruits[slow-1]==total[0])
slow--;
}
len=max(fast-slow, len);
fast++;
}
return max(fast-slow, len);
}
};