class Solution {
public static int totalFruit(int[] fruits) {
int left = 0, right = 0;
int firstSort = -1, secondSort = -1; //两种水果种类
int maxCount = 0; // 可以收集的最大数目
int thirdBefore = 0; // thirdBefore指向第三种果树的前一种果树的第一棵
//[3, 1, 1, 1, 3, 1, 1, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2]
//比如说第二轮就是从第一个2前面的三个1里面的第一个1开始
firstSort = fruits[left]; //第一个水果就是第一种水果
for (right = 0; right < fruits.length; right++) {
//第一次找到第二种水果
if (fruits[right] != firstSort && secondSort == -1) {
secondSort = fruits[right]; //将第二种水果的值赋值给第二个种类
}
//找到了第一种水果或者第二种水果
if (fruits[right] == firstSort || fruits[right] == secondSort) {
maxCount = right - left + 1 > maxCount ? right - left + 1 : maxCount; //更新收集的最大数目
} else {
//找到了第三种水果,开始下一轮:从第三种果树的前一种果树的第一棵开始遍历
left = thirdBefore; // 移动慢指针
firstSort = fruits[left];
secondSort = fruits[right];
}
// 前面两种水果每换一次种类,就更新一下thirdBefore,thirdBefore指向第三种果树的前一种果树的第一棵
if (right > 0 && fruits[right] != fruits[right - 1]) {
thirdBefore = right;
}
}
return maxCount;
}
}
//重点就是如何更新thirdBefore(指向第三种果树的前一种果树的第一棵)
//前面两种水果每换一次种类,就更新一下thirdBefore
904. 水果成篮
最新推荐文章于 2024-08-15 14:47:41 发布
这段代码定义了一个名为totalFruit的方法,用于在一个整数数组中找到最多能收集的不同种类的连续水果。方法通过遍历数组,维护三种水果种类和最大数量,关键在于更新thirdBefore。
摘要由CSDN通过智能技术生成