力扣原题链接
- 解法:快慢指针
- 思路:每次循环记录两个值,往后判断是否为这两个值;若是,则快指针右移一位并且长度加一,若不是,则将慢指针移到快指针所指值第一位处。
- 怎么记录值?:判断快指针所指值与慢指针所指值是否相同,相同则右移且长度加一,不同则记录。
int totalFruit(int* fruits, int fruitsSize){
int fastIndex = 0;
int slowIndex = 0;
int num_1 = fruits[0];
int num_2 = -1;//因为0 <= fruits[i] < fruits.length,所以可以通过设置num_2初始值不在该范围去进行后续判断
int lenMax = 2;
int temLen;
if(fruitsSize < 3) return fruitsSize;
for(; fastIndex < fruitsSize; fastIndex ++){
if(num_2 == -1 && fruits[fastIndex] != num_1){//判断是否为篮子里的第二个值
num_2 = fruits[fastIndex];
}else if(fastIndex == fruitsSize - 1 && (fruits[fastIndex] == num_1 || fruits[fastIndex] == num_2)){
//当快指针指向最后一位且最后一位满足装入篮子的条件时,计算长度
temLen = fastIndex - slowIndex + 1;
lenMax = (lenMax > temLen) ? lenMax : temLen;
}else if(fruits[fastIndex] != num_1 && fruits[fastIndex] != num_2){
//比较长度,取最大长度;并移动慢指针到fastIndex - 1所指值第一个位置
temLen = fastIndex - slowIndex;
lenMax = (lenMax > temLen) ? lenMax : temLen;
//定位慢指针到快指针前一位的值的首位置(救命...表达能力有限)
slowIndex = fastIndex - 1;
for(int temp = fruits[slowIndex]; fruits[slowIndex] == temp; slowIndex --) ;
slowIndex ++;
//重新对num_1、num_2赋值
num_1 = fruits[slowIndex];
num_2 = fruits[fastIndex];
}
}
return lenMax;
}