Leetcode第2958题
题目描述
https://leetcode.cn/problems/length-of-longest-subarray-with-at-most-k-frequency/description/
给你一个整数数组 nums 和一个整数 k 。 一个元素 x 在数组中的 频率 指的是它在数组中的出现次数。 如果一个数组中所有元素的频率都 小于等于 k ,那么我们称这个数组是 好 数组。 请你返回 nums 中 最长好 子数组的长度。 子数组 指的是一个数组中一段连续非空的元素序列
引言
题目什么的都很好理解,就一个普通的滑动窗口题
class Solution {
public int maxSubarrayLength(int[] nums, int k) {
int left = 0,right = 0;
Map<Integer, Integer> map = new HashMap<Integer,Integer>();
int count=0, max =0;
// cnt.merge(nums[left++], -1, Integer::sum);
while(right!=nums.length){
count++;
map.merge(nums[right], 1 ,Integer::sum );
// map.put(nums[right], map.getOrDefault(nums[right], 0) + 1);
while(map.get(nums[right]) > k){
count--;
// map.put(nums[left], map.get(nums[left]) - 1);
map.merge(nums[left], -1 ,Integer::sum);
left ++;
}
// System.out.println(max);
// System.out.println(count);
max = Math.max(max, right - left + 1);
right++;
}
return max;
}
}
当提交之后,无意点开一个代码看到 map.merge(nums[left], 1 ,Integer::sum); 没有用过的语法,吓得我赶紧一查,结果是JDK8就有的语法。 源码如下
Objects.requireNonNull(remappingFunction);
Objects.requireNonNull(value);
V oldValue = this.get(key);
V newValue = oldValue == null ? value : remappingFunction.apply(oldValue, value);
if (newValue == null) {
this.remove(key);
} else {
this.put(key, newValue);
}
return newValue;
}
大概就是如果给定的key不存在,它就变成了 put(key, value),如果 key 已经存在一些值,我们 remappingFunction 可以选择合并的方式,然后将合并得到的 newValue 赋值给原先的 key。相当于可以简化一定代码。
map.put(nums[right], map.getOrDefault(nums[right], 0) + 1);
-->
map.merge(nums[right], 1 ,Integer::sum );
总结
学无止境