疯狂子数组统计|青训营笔记

57 阅读1分钟

疯狂子数组的统计

问题描述

小M正在研究数组中的子数组问题。给定一个长度为 N 的数组 A,编号从 0N-1。如果一个从索引 ij 的子数组包含一个出现至少 K 次的元素 X,我们就称这个子数组为“疯狂子数组”。

现在,你需要计算数组 A 中所有的疯狂子数组的数量。

解题思路:

  1. 使用哈希表记录状态
  2. 左定右动,固定i=0.....n-1,移动右指针,分析是否满足条件,满足则返回n-j。
 int solution(int N, int K, std::vector<int> A) {
   // write code here
 ​
   int res = 0;
   for (int i = 0; i < N; i++) {
     std::map<int, int> mm;
     int max_i = 0;
     for (int j = i; j < N; j++) {
       mm[A[j]]++;
       max_i = std::max(max_i, mm[A[j]]);
       if (max_i >= K) {
         res += N - j;
         break;
       }
     }
   }
   return res;
 }

尽管在最坏情况下时间复杂度在O(n^2),但当每一次定点分析时,只要发现满足情况,即可跳出循环,继续执行下一次定点分析,在最好情况下,时间复杂度在O(n)。