给定一个长度为 n 的整数数组 a1,a2,…,an ,数组中的每个元素都是一个 1∼n 之间的整数。 我们规定,数组中出现次数最多的元素为数组的核心元素,例如数组 [1,1,1,2,3] 的核心元素为 1 。 此外,如果数组中出现次数最多的元素不唯一,则出现次数最多的元素中数值最小的那个元素为数组的核心元素,例如数组 [1,2,2,3,3] 的核心元素为 2 。 对于 1≤i≤n 的每个整数 i ,请你计算有多少个给定数组的非空连续子数组的核心元素为 i 。 c++实现
时间: 2024-02-13 10:00:47 浏览: 274
以下是 C++ 的实现代码:
```cpp
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int max_cnt = 0, core = 0;
unordered_map<int, int> cnt;
for (int x : a) {
cnt[x]++;
if (cnt[x] > max_cnt || (cnt[x] == max_cnt && x < core)) {
max_cnt = cnt[x];
core = x;
}
}
unordered_map<int, int> cur_cnt;
int ans = 0;
for (int i = 0; i < n; i++) {
if (a[i] == core) {
cur_cnt[a[i]]++;
} else {
cur_cnt[a[i]]--;
if (cur_cnt[a[i]] == 0) {
cur_cnt.erase(a[i]);
}
}
int max_cnt = 0;
for (auto p : cur_cnt) {
max_cnt = max(max_cnt, p.second);
}
if (max_cnt == cur_cnt[core]) {
ans++;
}
}
for (int i = 1; i <= n; i++) {
if (i != core) {
cout << 0 << endl;
} else {
cout << ans << endl;
}
}
return 0;
}
```
其中,第 4 行到第 13 行遍历数组,用哈希表统计每个元素出现的次数,并找出出现次数最多的元素。
第 15 行到第 30 行针对每个可能的核心元素,从左到右遍历数组,维护一个当前连续子数组的哈希表,记录每个元素在当前连续子数组中出现的次数。同时,维护一个计数器 count,记录当前连续子数组中出现次数最多的元素的出现次数。每次更新完哈希表后,判断出现次数最多的元素是否为当前核心元素,如果是,则将当前连续子数组中以当前元素结尾的子数组的个数加入到以当前核心元素结尾的子数组的个数中。
最后,第 32 行到第 38 行输出每个可能的核心元素的以该元素结尾的子数组的个数。
阅读全文