zoukankan      html  css  js  c++  java
  • Leetcode 904 Fruit Into Baskets (双指针)

    Leetcode 904

    问题描述

    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:
    
    Add one piece of fruit from this tree to your baskets.  If you cannot, stop.
    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.
    

    方法

    ** Solution Java **
    ** 5ms, beats 90.26% **
    ** 46.7MB, beats 92.45% **
    class Solution {
        public int totalFruit(int[] tree) {
            int n = tree.length, count = 2, res = 0;
            int[] map = new int[n];
            for (int i = 0, j = 0; j < n; ++j) {
                if (map[tree[j]] == 0)
                    --count;
                ++map[tree[j]];
                while (count == -1) {
                    if (--map[tree[i++]] == 0)
                        ++count;
                }
                res = Math.max(res, j - i + 1);
            }
            return res;
        }
    }
    

    方法二

      循环所有的水果c中tree,
      需要注意的是a和b是我们见面的最后两个不同类型的水果,
      c是目前果型,
      所以它的东西,如“...... aaabbbc ......”

      案例1 c == b:
      水果c已经在篮子里,
      和最后一种水果相同
      cur += 1
      count_b += 1

      案例2 c == a:
      水果c已经在篮子里了,
      但与最后一种水果不一样
      cur += 1
      count_b = 1
      a = b, b = c

      情况3 c != b && c!= a:
      水果c不在篮子里,
      cur = count_b + 1
      count_b = 1
      a = b, b = c

    当然,在每一轮中我们都需要更新 res = max(res, cur)

    ** Solution Java **
    ** 5ms, beats 90.26% **
    ** 47MB, beats 86.79% **
    class Solution {
        public int totalFruit(int[] tree) {
            int res = 0, cur = 0, count_b = 0, a = 0, b = 0;
            for (int c :  tree) {
                cur = c == a || c == b ? cur + 1 : count_b + 1;
                count_b = c == b ? count_b + 1 : 1;
                if (b != c) {a = b; b = c;}
                res = Math.max(res, cur);
            }
            return res;
        }
    }
    
  • 相关阅读:
    bootstrutp module 显示隐藏 模态框
    手机app传统邀请码安装与免邀请码安装区别,如何选择呢?
    好用的一些开源系统
    一个搞笑的招聘启事
    java和android及IOS对接RSA加密经验
    mysql大数据表改表结构方案
    android开发中监控android软件网络请求的软件Charles使用入门
    android IOC框架学习记录
    java分布式事务
    十八届三中全会的综合改革方案将涉及哪些内容?(转自知乎)
  • 原文地址:https://www.cnblogs.com/willwuss/p/12518264.html
Copyright © 2011-2022 走看看