leetCode 904 水果成篮

其实就是:找至多包含两种元素的最长子串,返回其长度

我们可以使用滑动窗口来做这道题,具体思路如下:

1:使用hash表来存储果树和果树上果子的数量

2:定义快慢指针,然后给集合存值,put(果子种类编号,该编号下的果子数量)

3:使用while循环来定义标准:种类不超过2;如果超过2  就要慢指针(left)指向的果树的果子 -1 只要果子种类大于2 就一直减 left也一直++ 直到=0 删去了这个果种,然后记录当前的长度,然后快指针right继续向后遍历。

private static int totalFruit5(int[] fruits) {
        int n = fruits.length;
        Map<Integer, Integer> cnt = new HashMap<Integer, Integer>();

        int left = 0, ans = 0; // 记录并更新最大长度 即最后的返回值
        for (int right = 0; right < n; ++right) {
            // put右指针 对应的水果类型 并且记录其次数
            // 如果有则次数+1 无则为0次+1
            // 其实就是用的集合的下标来存水果数的种类
            cnt.put(fruits[right], cnt.getOrDefault(fruits[right], 0) + 1);
            // 水果种类超过2种 需要收缩窗口 让其只包含2种水果
            while (cnt.size() > 2) {
                cnt.put(fruits[left], cnt.get(fruits[left]) - 1);
                // 为0说明其不在窗口内 移除
                if (cnt.get(fruits[left]) == 0) {
                    // 移除后表内只剩下两个种类 while循环跳出
                    cnt.remove(fruits[left]);
                }
                // 移除之后慢指针++ 然后后续判断前面2个种类数的果子能有多长
                ++left;
            }
            ans = Math.max(ans, right - left + 1);
        }
        return ans;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值