Welcome to Subscribe On Youtube
2799. Count Complete Subarrays in an Array
Description
You are given an array nums
consisting of positive integers.
We call a subarray of an array complete if the following condition is satisfied:
- The number of distinct elements in the subarray is equal to the number of distinct elements in the whole array.
Return the number of complete subarrays.
A subarray is a contiguous non-empty part of an array.
Example 1:
Input: nums = [1,3,1,2,2] Output: 4 Explanation: The complete subarrays are the following: [1,3,1,2], [1,3,1,2,2], [3,1,2] and [3,1,2,2].
Example 2:
Input: nums = [5,5,5,5] Output: 10 Explanation: The array consists only of the integer 5, so any subarray is complete. The number of subarrays that we can choose is 10.
Constraints:
1 <= nums.length <= 1000
1 <= nums[i] <= 2000
Solutions
-
class Solution { public int countCompleteSubarrays(int[] nums) { Set<Integer> s = new HashSet<>(); for (int x : nums) { s.add(x); } int cnt = s.size(); int ans = 0, n = nums.length; for (int i = 0; i < n; ++i) { s.clear(); for (int j = i; j < n; ++j) { s.add(nums[j]); if (s.size() == cnt) { ++ans; } } } return ans; } }
-
class Solution { public: int countCompleteSubarrays(vector<int>& nums) { unordered_set<int> s(nums.begin(), nums.end()); int cnt = s.size(); int ans = 0, n = nums.size(); for (int i = 0; i < n; ++i) { s.clear(); for (int j = i; j < n; ++j) { s.insert(nums[j]); if (s.size() == cnt) { ++ans; } } } return ans; } };
-
class Solution: def countCompleteSubarrays(self, nums: List[int]) -> int: cnt = len(set(nums)) ans, n = 0, len(nums) for i in range(n): s = set() for x in nums[i:]: s.add(x) if len(s) == cnt: ans += 1 return ans
-
func countCompleteSubarrays(nums []int) (ans int) { s := map[int]bool{} for _, x := range nums { s[x] = true } cnt := len(s) for i := range nums { s = map[int]bool{} for _, x := range nums[i:] { s[x] = true if len(s) == cnt { ans++ } } } return }
-
function countCompleteSubarrays(nums: number[]): number { const s: Set<number> = new Set(nums); const cnt = s.size; const n = nums.length; let ans = 0; for (let i = 0; i < n; ++i) { s.clear(); for (let j = i; j < n; ++j) { s.add(nums[j]); if (s.size === cnt) { ++ans; } } } return ans; }
-
use std::collections::HashSet; impl Solution { pub fn count_complete_subarrays(nums: Vec<i32>) -> i32 { let mut set: HashSet<&i32> = nums.iter().collect(); let n = nums.len(); let m = set.len(); let mut ans = 0; for i in 0..n { set.clear(); for j in i..n { set.insert(&nums[j]); if set.len() == m { ans += n - j; break; } } } ans as i32 } }