题目描述
blablabla
样例
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
/*
思考过程:
我最终得出,它是求一个原始序列中的连续子序列的个数的题,
我无法找到去计算重复元素的序列数量的方法,导致裂开。
看过别人代码后:
这题需要使用数据结构,去对元素进行处理。
首先,这个一定是要排序的,
这里我使用了stl,map容器。
达到去重和排序的作用,
以元素为键,元素出现的次数为值。
在容器中填入所有元素后,一定是一个递增的,也许不连续的数列。只有一个值的情况除外。
遍历map,将每个元素与它之前的一个连续的元素的出现次数进行比较,取大于零的差值,否则就取零。
此处我理解为:
对于一个元素,如果它紧挨着的(连续的)前一个元素出现的次数跟它一样,如2233的情形,就不必再加,因为之前已经加过了。
若二者次数不等,比前者小,他们差值为负,不必理会,说明前面重复的元素有长度为1的子序列。
比前者大,就差值为正,则需要加上差值,差值个数的元素可能是长度为1的子序列,或者新的连续子序列的开头。
就此,所有情况都考虑后,最终的和,就为总的连续子序列的数量。
数据结构类型的,头一次遇见。
*/
int main() {
int t,n,num;
cin >> t;
while (t--) {
cin >> n;
map<int, int > ma;
for (int i = 0; i < n; i++) {
cin >> num;
ma[num]++;
}
int res = 0;
for (auto i = ma.begin(); i != ma.end(); i++) {
res += max(0, i->second - ma[i->first - 1]);
}
cout << res << endl;
}
return 0;
}
算法1
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
blablabla
算法2
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
blablabla