打卡 DAY 5 长度最小的子数组相关题目——水果成篮

力扣原题链接

  • 解法:快慢指针
  • 思路:每次循环记录两个值,往后判断是否为这两个值;若是,则快指针右移一位并且长度加一,若不是,则将慢指针移到快指针所指值第一位处。
  • 怎么记录值?:判断快指针所指值与慢指针所指值是否相同,相同则右移且长度加一,不同则记录。
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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值