酷代码 AI
菜单

小核桃马上就要读五年级了,喜欢数学的他今天学习了一个新的知识:众数,所谓的众数就是一个数组中出现次数最多的那个数。 现在有这样一个问题:对于长度为 n n 的数组,给定 k k ,求有多少个连续的子数组的众数出现次数不小于 k k 。 对于给定的数组 A [ 1.. n ] A[1..n], 如果存在一个整数 i i 和一个整数 j j,使得 1 ≤ i ≤ j ≤ n 1≤i≤j≤n, 那么 A [ i ] , A [ i + 1 ] , A [ i + 2 ] , . . . , A [ j ] A[i],A[i+1],A[i+2],...,A[j] 就称为数组 A A 的一个连续子数组。 聪明的你可以帮小核桃解决这个麻烦的问题吗? 输入描述 第一行包含两个整数 n , k n,k 。 第二行包含 n n 个整数,表示第 i i 个数字值为 a i a i ​ ,之间以一个空格隔开。 输出描述 输出一个整数表示答案。 使用c++语言

```cpp #include <iostream> #include <vector> #include <unordered_map> using namespace std; int main() { int n, k; cin >> n >> k; vector<int> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; } long long ans = 0; // 枚举所有子数组 for (int i = 0; i < n; i++) { unordered_map<int, int> freq; // 记录每个数字出现的次数 int maxFreq = 0; // 当前子数组的众数出现次数 for (int j = i; j < n; j++) { freq[a[j]]++; maxFreq = max(maxFreq, freq[a[j]]); if (maxFreq >= k) { ans++; } } } cout << ans << endl; return 0; } ``` 代码说明: - 使用双重循环枚举所有子数组 `a[i..j]`。 - 用哈希表 `freq` 统计子数组中每个数字的出现次数。 - 变量 `maxFreq` 记录当前子数组的众数出现次数。 - 如果 `maxFreq >= k`,答案加一。 - 时间复杂度为 O(n²),适合 n 较小的情况(如 n ≤ 2000)。 - 对于更大的 n,需要优化算法,例如使用分治或双指针技巧。 [2026-01-20 19:16:17 | AI问答 | 320点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多