疯狂子数组的统计
问题描述
小M正在研究数组中的子数组问题。给定一个长度为 N 的数组 A,编号从 0 到 N-1。如果一个从索引 i 到 j 的子数组包含一个出现至少 K 次的元素 X,我们就称这个子数组为“疯狂子数组”。
现在,你需要计算数组 A 中所有的疯狂子数组的数量。
解题思路:
- 使用哈希表记录状态
- 左定右动,固定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)。