Leetcode 2799.统计完全子数组的数目(不定长滑动窗口(求子数组个数)

给你一个由  整数组成的数组 nums 。

如果数组中的某个子数组满足下述条件,则称之为 完全子数组 :

  • 子数组中 不同 元素的数目等于整个数组不同元素的数目。

返回数组中 完全子数组 的数目。

子数组 是数组中的一个连续非空序列。

示例 1:

输入:nums = [1,3,1,2,2]
输出:4
解释:完全子数组有:[1,3,1,2]、[1,3,1,2,2]、[3,1,2] 和 [3,1,2,2] 。

示例 2:

输入:nums = [5,5,5,5]
输出:10
解释:数组仅由整数 5 组成,所以任意子数组都满足完全子数组的条件。子数组的总数为 10 。

提示:

  • 1 <= nums.length <= 1000
  • 1 <= nums[i] <= 2000

方法1: 

class Solution {
    public int countCompleteSubarrays(int[] nums) {
        var set = new HashSet();
        for(int num : nums) set.add(num);
        int n = set.size();
        var cnt = new HashMap();
        int ans = 0, left = 0;
        for(int right : nums){//相当于右端点
            cnt.merge(right, 1, Integer::sum);
            while(cnt.size() == n){
                int x = nums[left++];
                if(cnt.merge(x, -1, Integer::sum) == 0){
                    cnt.remove(x);
                }
            }
            ans += left;
        }
        return ans;
    }
}

方法2:

class Solution {
    public int countCompleteSubarrays(int[] nums) {
        var set = new HashSet();
        for (int num : nums){
            set.add(num);
        }
        int cnt = set.size();
        int[] arr = new int[2001];
        int left = 0, ans = 0;
        int less = 0;
        for(int right = 0; right < nums.length; right++){
            if(arr[nums[right]]++ == 0){
                less++;
            }
            while(less == cnt){
                if(--arr[nums[left++]] == 0){
                    less--;
                }
            }
            ans += left;
        }
        return ans;
    }
}

你可能感兴趣的:(Leetcode,leetcode,算法,数据结构)