每日一题 — 水果成篮

904. 水果成篮 - 力扣(LeetCode)

思路:

通过阅读上面文字得出问题:就去只有两个种类的最大长度的连续子数组,这时我们可以想到用哈希表来存储数据,记录数据的种类和每个种类的数量。 

解法一:暴力递归(right每次遍历完都回退)

解法二:滑动窗口

  • 定义left、right为0两个变量,固定left,遍历right,将right位置的值存入哈希表,并且记录下该值的数量
  • 当哈希表的长度大于2时,减去哈希表中left位置的值的数量,当减到零的时候,将该值删除
  • 更新结果

代码:

public int totalFruit(int[] f) {
        int ret = 0;
        //将数据存储在哈希表中
        Map<Integer,Integer> hash = new HashMap<>();
        for(int left = 0,right = 0; right < f.length; right++){
            int in = f[right];
            //进窗口
            hash.put(in,hash.getOrDefault(in,0)+1);
            //判断
            while(hash.size() > 2){
                int out = f[left++];
                //出窗口
                hash.put(out,hash.get(out) - 1);
                //当该数据为0 =时,就在哈希表中删除
                if(hash.get(out) == 0){
                    hash.remove(out);
                }
            }
            //更新结果
            ret = Math.max(ret, right - left +1);
        }
        return ret;
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值