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 );

总结

学无止境