水果成篮,双指针图文并茂LeetCode_904
题目信息
示例 1: 输入:[1,2,1] 输出:3 解释:我们可以收集 [1,2,1]。
示例 2: 输入:[0,1,2,2] 输出:3 解释:我们可以收集 [1,2,2] 如果我们从第一棵树开始,我们将只能收集到 [0, 1]。
示例 3: 输入:[1,2,3,2,2] 输出:4 解释:我们可以收集 [2,3,2,2] 如果我们从第一棵树开始,我们将只能收集到 [1, 2]。
示例 4: 输入:[3,3,3,1,2,1,1,2,3,3,4] 输出:5 解释:我们可以收集 [1,2,1,1,2] 如果我们从第一棵树或第八棵树开始,我们将只能收集到 4 棵水果树。
解析: 定义双指针i,j。创建一个哈希表统计每种水果的收集的数量,res为答案。i指针遍历fruits数组,并将当前i下标的值放到哈希表中,如果哈希表的长度大于2了。这时候判断j下标哈希表的value是不是1,如果是1的话说明j下标的值没有尽可能的存放多的水果数量。不是最优解。就在哈希表中删除它。如果不是1,就把当前j下标的值放到哈希表中,value是j下标自己的value-1.跳出while循环后j指针向后移动一位。并更新res、
代码实现:
public int totalFruit(int[] fruits) { //记录答案 int res=0; //哈希表统计每种水果数量 HashMap<Integer,Integer> map=new HashMap<> (); for(int i=0,j=0;i<fruits.length;i++){ //将当前i下标的水果放到map中,统计次数 map.put (fruits[i],map.getOrDefault (fruits[i],0)+1); //当map的size大于2了,就说明需要检查答案是否是最优解 while (map.size ()>2){ //因为要尽可能的在两种水果里多放一些就要检查j的数量是不是太少了。少了就剔除 if(map.get (fruits[j])==1){ map.remove (fruits[j]); }else { map.put (fruits[j],map.get (fruits[j])-1); } j++; } //更新答案 res=Math.max (res,i-j+1); } return res; }
下一篇:
Java的继承性详细分析