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;
        }
    }
    
  • 相关阅读:
    统计脚本代码行数
    expr算术运算
    lsof命令
    测试当前机器可以创建多少线程
    守护进程写日志
    文件描述符fd,struct files_struct
    linux查看反汇编
    信号补充
    Windows10获取VS管理员权限总是很烦人
    asp.net中的Filter类型其实是被当作单例的
  • 原文地址:https://www.cnblogs.com/willwuss/p/12518264.html
Copyright © 2011-2022 走看看