水果成篮-力扣

发布于:2024-05-24 ⋅ 阅读:(147) ⋅ 点赞:(0)

这道题目一开始的思路是利用水果的种类大于等于三,来作为滑动窗口的维护条件,使用两个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;
    }
};

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


网站公告

今日签到

点亮在社区的每一天
去签到