力扣904.水果成篮

904.水果成篮

思路:

本题使用滑动窗口方法。当有三个不同的时候就将此窗口最左边的移出,然后依次找最多的即可。

代码实现:
class Solution {
    public int totalFruit(int[] fruits) {
        HashMap<Integer, Integer> map = new HashMap<>();
        int left = 0;
        int right = 0;
        int ans = 0;
        int length = fruits.length;

        while (right < length) { //滑动窗口
            map.put(fruits[right], map.getOrDefault(fruits[right], 0) + 1);
            while (map.size() > 2) { //有三个不相同的
                map.put(fruits[left], map.getOrDefault(fruits[left], 0) - 1);//移除左边的
                //此处不能直接remove,因为考虑到  [3,3,3,1,...]这种情况
                if (map.get(fruits[left]) == 0) {
                    map.remove(fruits[left]);
                }
                left++;
            }
            //求ans放在外面,因为如果放在while里面的话,[1,2,1]这种情况不会求ans
            ans = Math.max(right - left + 1, ans);
            right++;
        }
        return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值