【发布时间】:2019-03-06 11:50:05
【问题描述】:
我在网上发现了一个编程挑战,想知道是否有更有效的解决方案。
问题: 您将获得一个包含 n 个数字的列表以及一个数字 X,它指的是可以包含在连续子数组中的不同数字的最大数量。我们需要统计所有满足 X 条件的连续子数组。
输入 第一行是两个数字 n 和 x;子数组中的数字数量和唯一数字的最大数量。
例子:
5 2
1 2 3 1 1
ans = 10
explanation: ([1],[2],[3],[1],[1],[1,2],[2,3],[3,1],[1,1],[3,1,1])
我的方法 使用两个循环遍历列表的所有子数组,并计算相关子数组中唯一数字的数量(使用集合)。当然,必须有一种更有效的方法来计算这个?抱歉,如果这个问题不属于这里,请随时编辑。
编辑:nellex 的更正代码有时会给出错误的答案
int main() {
int n, x;
cin >> n >> x;
vector<int> a;
for (int i = 1; i <= n; i++) {
int b;
cin >> b;
a.push_back(b);
}
int ans = 0, end = 1;
set<int> uniq;
map<int, int> freq;
for (int start = 0; start < n; start++) {
cout << start << " and end=" << end << endl;
while (uniq.size() <= x && end < n) {
if (uniq.size() == x && freq[a[end]] == 0) {
break;
}
uniq.insert(a[end]);
freq[a[end]]++;
end++;
}
cout << "added " << end << " - " << start << " to ans" << endl;
ans += end - start;
freq[a[start]]--;
if (freq[a[start]] == 0) {
uniq.erase(a[start]);
}
}
cout << ans;
}
编辑: 第一个测试用例约束:
1≤k≤n≤100
1≤xi≤10
最大的限制:
1≤k≤n≤5⋅10^5
1≤xi≤10^9
【问题讨论】:
-
我很困惑。问题是什么?为什么 x 2 是三位数?如果我们想要唯一的数字,为什么答案包含三遍
[1]?,... -
在示例中,问题是列表 [1,2,3,1,1] 的子数组中有多少包含最大值。 2 个唯一编号。对不起,如果我不清楚。
-
为什么你认为你正在做的事情是低效的。也就是说,我删除了 C++ 标签,因为这无论如何都不是关于 C++ 的问题。
-
@UlrichEckhardt 因为有大的测试用例(例如 10^5)我的代码超过了时间限制。
-
@Quiti 我看到你修改了代码有点不正确。如果您将数组索引为 0,请在初始化期间设置
int end = 0。同样对于给定的约束,您需要使用long long来回答。
标签: arrays algorithm sub-array