zoukankan      html  css  js  c++  java
  • [LeetCode] 904. Fruit Into Baskets

    In a row of trees, the i-th tree produces fruit with type tree[i].

    You start at any tree of your choice, then repeatedly perform the following steps:

    1. Add one piece of fruit from this tree to your baskets.  If you cannot, stop.
    2. Move to the next tree to the right of the current tree.  If there is no tree to the right, stop.

    Note that you do not have any choice after the initial choice of starting tree: you must perform step 1, then step 2, then back to step 1, then step 2, and so on until you stop.

    You have two baskets, and each basket can carry any quantity of fruit, but you want each basket to only carry one type of fruit each.

    What is the total amount of fruit you can collect with this procedure?

    Example 1:

    Input: [1,2,1]
    Output: 3
    Explanation: We can collect [1,2,1].
    

    Example 2:

    Input: [0,1,2,2]
    Output: 3
    Explanation: We can collect [1,2,2].
    If we started at the first tree, we would only collect [0, 1].
    

    Example 3:

    Input: [1,2,3,2,2]
    Output: 4
    Explanation: We can collect [2,3,2,2].
    If we started at the first tree, we would only collect [1, 2].
    

    Example 4:

    Input: [3,3,3,1,2,1,1,2,3,3,4]
    Output: 5
    Explanation: We can collect [1,2,1,1,2].
    If we started at the first tree or the eighth tree, we would only collect 4 fruits.

    Note:

    1. 1 <= tree.length <= 40000
    2. 0 <= tree[i] < tree.length

    水果成篮。题目的糖衣写的很模糊,难怪这个题的downvote更多。讲的直白一点,这个题是给你一个数组,数组代表一排树,每个坐标上的值tree[i]代表树的类型。只允许你收集两种树上的果子,请问你最多能收集多少果子。实际问的是只能收集两种果子的情况下,如何能使你收集的这个子数组最长。返回的是能收集的最长的长度。比如例子三,[1,2,3,2,2],收集的是2和3两种果子,组成的最长子串的长度是4。

    思路是sliding window滑动窗口,基本可以套用76题的模板。这个题基本跟159题没有区别。

    时间O(n)

    空间O(n)

    Java实现

     1 class Solution {
     2     public int totalFruit(int[] tree) {
     3         HashMap<Integer, Integer> map = new HashMap<>();
     4         int res = 0;
     5         int left = 0;
     6         int right = 0;
     7         while (right < tree.length) {
     8             map.put(tree[right], map.getOrDefault(tree[right], 0) + 1);
     9             right++;
    10             while (map.size() > 2) {
    11                 map.put(tree[left], map.get(tree[left]) - 1);
    12                 if (map.get(tree[left]) == 0) {
    13                     map.remove(tree[left]);
    14                 }
    15                 left++;
    16             }
    17             res = Math.max(res, right - left);
    18         }
    19         return res;
    20     }
    21 }

    sliding window相关题目

    LeetCode 题目总结

  • 相关阅读:
    2.pt-table-checksum工具
    Mysql8.0新特性01
    12.redis 之阅读大佬文章随笔
    4.Mysql之Mysqldump命令
    5. 关于高负载服务器Kernel的TCP参数优化
    Mysql Oracle 备份表数据、批量删除表数据
    Mysql limit用法
    Java 字符串数组转字符串
    Layui 自定义年份下拉框并且可输入
    Mysql 生成UUID
  • 原文地址:https://www.cnblogs.com/cnoodle/p/13334357.html
Copyright © 2011-2022 走看看