水果成篮,双指针图文并茂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的继承性详细分析
