滑动窗口思想,确实是想到了,可是Java内置函数是一点儿不会啊sos
class Solution {
public int totalFruit(int[] fruits) {
int n = fruits.length;
// 创建一个HashMap对象cnt,用于存储水果种类和出现次数
Map<Integer, Integer> cnt = new HashMap<Integer, Integer>();
// left滑动窗口初始位置,ans记录最大水果种类的数量
int left = 0, ans = 0;
// right滑动窗口终止位置,遍历数组fruits
for (int right = 0; right < n; ++right) {
// 在当前右边 right 位置放置一个水果,并增加这个水果的计数。
cnt.put(fruits[right], cnt.getOrDefault(fruits[right], 0) + 1);
// 当 cnt 中的水果种类数量大于 2 时,进行循环。
while (cnt.size() > 2) {
// 移除窗口左边 left 位置的水果,并减少这个水果的计数。
cnt.put(fruits[left], cnt.get(fruits[left]) - 1);
// 如果左边的水果计数为 0,说明这个水果已经被完全移除了。
if (cnt.get(fruits[left]) == 0) {
// 从 cnt 中移除这个水果。
cnt.remove(fruits[left]);
}
// 窗口左边界 left 向右移动一位。
++left;
}
// 更新答案 ans,即记录最多可以同时存在的不同水果种类数量。
ans = Math.max(ans, right - left + 1);
}
return ans;
}
}
HashMap
- 用KV键值对存储元素,元素是无序的,key不允许重复,value允许重复,允许存储null。
- 添加元素(键值对):
put(key, value)方法
- 访问元素:
get(key)方法
- 删除元素:
remove(key)方法
可以删除key对应的键值对 - 删除所有键值对:
clear()方法
- 获取指定key对应value,如果找不到key则返回默认值:
getOrDefault()方法
- 计算HashMap元素数量:
size()方法
- 迭代HashMap:可以使用
for-each
来迭代 HashMap 中的元素。如果你只想获取 key,可以使用keySet() 方法
,然后可以通过get(key)方法
获取对应的 value,如果你只想获取 value,可以使用values() 方法
。
// 引入 HashMap 类
import java.util.HashMap;
public class RunoobTest {
public static void main(String[] args) {
// 创建 HashMap 对象 Sites
HashMap<Integer, String> Sites = new HashMap<Integer, String>();
// 添加键值对
Sites.put(1, "Google");
Sites.put(2, "Runoob");
Sites.put(3, "Taobao");
Sites.put(4, "Zhihu");
// 输出 key 和 value
for (Integer i : Sites.keySet()) {
System.out.println("key: " + i + " value: " + Sites.get(i));
}
// 返回所有 value 值
for(String value: Sites.values()) {
// 输出每一个value
System.out.print(value + ", ");
}
}
}
Math
- 返回两个参数中的最大值:
max()方法