水果成篮-力扣

这道题目一开始的思路是利用水果的种类大于等于三,来作为滑动窗口的维护条件,使用两个key值来记录两种水果的值,当遇到第三种水果时,则将slowindex设置为slowindex-1,然后将slowindex逐渐缩小,来查找前x个相同的元素,之后重新设置key值,继续搜索。具体代码如下:

class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        int slowindex = 0;
        int fastindex = 1;
        int sum= 1;
        int kind = 1;
        int key1 = fruits[slowindex];
        int key2 = -1;

        if(fruits.size() == 0){
            return 0;
        }

        while(fastindex < fruits.size()){
            if(kind < 2){
                if(fruits[fastindex] == key1){
                    fastindex++;
                    sum++;
                }else if(key2 < 0){
                    key2 = fruits[fastindex];
                    kind++;
                    sum++;
                    fastindex++;
                }
            }

            if(fruits[fastindex] == key1 || fruits[fastindex] == key2){
                sum++;
                fastindex++;
            }else{
                kind++;
            }

            while(kind >= 3){
                slowindex = fastindex - 1;
                key1 = fruits[slowindex--];

                while(fruits[slowindex] == key1){
                    slowindex--;
                }
                
                key2 = fruits[fastindex];
                kind--;
                fastindex++;
            }
            sum = max(sum, fastindex - slowindex - 1);
        }

        return sum;
    }
};

但很快就出了问题,在测试用例 [3,3,3,1,2,1,1,2,3,3,4]时,预期结果为5,而我的代码输出结果却为8,在思考后得出结论:

  • sum的更新和维护,在代码1中,没有用到currentsum来记录当前的最大值,仅仅使用了一个sum来计数,导致这个sum在满足条件 fruits[fastindex] == key1 || fruits[fastindex] == key2 时便会增加,从而导致sum不断增加,fastindex - slowindex - 1 不会被取到。修改后的代码如下:
class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        int slowindex = 0;
        int fastindex = 0;
        int sum = 0;
        int currentsum = 0;
        int key1 = fruits[slowindex];
        int key2 = -1;

        while(fastindex < fruits.size()) {
            if (fruits[fastindex] == key1 || fruits[fastindex] == key2) {
                currentsum++;
                fastindex++;
            } else{
                if (key2 == -1) {
                    key2 = fruits[fastindex];
                    currentsum++;
                    fastindex++;
                }else{
                    sum = max(sum, currentsum);
                    currentsum = 2;
                    slowindex = fastindex - 1;
                    key1 = fruits[slowindex];
                    while (slowindex > 0 && fruits[slowindex - 1] == key1) {
                        currentsum++;
                        slowindex--;
                    }
                    key2 = fruits[fastindex];
                    fastindex++;
                }
            }
            
        }
        sum = max(sum, currentsum);
        return sum;
    }
};

这段代码就能够顺利通过了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值