Leetcode-2537. 统计好子数组的数目

Problem: 2537. 统计好子数组的数目

思路

滑动窗口

解题过程

思路:

使用滑动窗口来维护子数组,并通过组合计数动态调整满足条件的数对数目。具体来说,我们维护一个窗口[l,r],使得窗口内相同元素的对数至少为 k,并计算这样的窗口数目。

关键观察:

  • 当一个元素的频次从 c 增加到 c+1 时,新增加的数对数目为 c(因为新元素可以与之前的 c 个元素形成 c 对)。
  • 当一个元素的频次从 c 减少到 c-1 时,减少的数对数目为 c-1(因为移除的元素与剩余的 c-1 个元素的数对被移除)。

算法步骤:

  • 使用两个指针 l 和 r 维护滑动窗口,使用哈希表 cnt 记录元素频次,使用变量 t 记录窗口内的数对数目。
  • 右指针 r 不断扩展窗口,更新元素频次和数对数目 t。
  • 当 t >= k 时,尝试移动左指针 l 缩小窗口,同时更新数对数目 t,直到窗口不再满足条件。
  • 此时,以 r 结尾且满足条件的子数组数目为 l(即左端点可以是 0 到 l-1 的任意位置)。

Code

python

python 复制代码
class Solution:
    def countGood(self, nums: List[int], k: int) -> int:
        n = len(nums)
        ans = 0
        l = 0
        cnt = defaultdict(int)  # 记录数组中的元素频次
        t = 0  # 记录此时窗口的满足i<j且nums[i]=nums[j]的对数

        for r, x in enumerate(nums):
            cnt[x] += 1
            if cnt[x] >= 2:
                t += cnt[x] - 1
            while t >= k and l < r:
                cnt[nums[l]] -= 1
                if cnt[nums[l]] >= 1:
                    t -= cnt[nums[l]]
                l += 1
            ans += l

        return ans

c++

cpp 复制代码
class Solution {
public:
    long long countGood(vector<int>& nums, int k) {
        int n = nums.size();
        long long ans = 0;
        int l = 0;
        unordered_map<int, int> cnt;
        int t = 0;

        for (int r = 0; r < n; r++) {
            cnt[nums[r]]++;
            if (cnt[nums[r]] >= 2)
                t += cnt[nums[r]] - 1;

            while (t >= k && l < r) {
                cnt[nums[l]]--;
                if (cnt[nums[l]] >= 1)
                    t -= cnt[nums[l]];
                l++;
            }
            ans += l;
        }
        return ans;
    }
};

复杂度

  • 时间复杂度: O(n)
  • 空间复杂度: O(n),用哈希表存储元素频次。
相关推荐
小O的算法实验室20 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
郭涤生21 小时前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿21 小时前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz21 小时前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能21 小时前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****21 小时前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能1 天前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
汀、人工智能1 天前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数
CoderCodingNo1 天前
【GESP】C++四、五级练习题 luogu-P1177 【模板】排序
数据结构·c++·算法
Proxy_ZZ01 天前
从零实现LDPC比特翻转译码器:C语言实战与底层逻辑解析
c语言·算法