[LeetCode] 2962. Count Subarrays Where Max Element Appears at Least K Times

CNoodle發表於2024-03-30

You are given an integer array nums and a positive integer k.

Return the number of subarrays where the maximum element of nums appears at least k times in that subarray.

A subarray is a contiguous sequence of elements within an array.

Example 1:
Input: nums = [1,3,2,3,3], k = 2
Output: 6
Explanation: The subarrays that contain the element 3 at least 2 times are: [1,3,2,3], [1,3,2,3,3], [3,2,3], [3,2,3,3], [2,3,3] and [3,3].

Example 2:
Input: nums = [1,4,2,1], k = 3
Output: 0
Explanation: No subarray contains the element 4 at least 3 times.

Constraints:
1 <= nums.length <= 105
1 <= nums[i] <= 106
1 <= k <= 105

統計最大元素出現至少 K 次的子陣列。

給你一個整數陣列 nums 和一個 正整數 k 。

請你統計有多少滿足 「 nums 中的 最大 元素」至少出現 k 次的子陣列,並返回滿足這一條件的子陣列的數目。

子陣列是陣列中的一個連續元素序列。

思路

不難想到是滑動視窗。但是注意這道題問的是最大元素出現至少 k 次的子陣列,而不是恰好 k 次。如果問的是恰好 k 次的話,當右指標遇到第 k 個最大元素的時候,左指標就可以開始動了,類似76題那種形式。但是這道題當右指標移動到第 k 個最大元素的時候,因為左右指標中間包含了 k 個最大元素,所以左指標及其左邊,都是合法的子陣列,都包含了起碼 k 個最大元素。

複雜度

時間O(n)
空間O(n)

程式碼

Java實現

class Solution {
    public long countSubarrays(int[] nums, int k) {
        int max = Arrays.stream(nums).max().orElseThrow();
        int start = 0;
        int end = 0;
        int count = 0;
        long res = 0;
        while (end < nums.length) {
            int cur = nums[end++];
            if (cur == max) {
                count++;
            }
            while (count >= k) {
                if (nums[start++] == max) {
                    count--;
                }
            }
            res += start;
        }
        return res;
    }
}

相關文章