我需要一个算法来查找正整数数组中三个数字的唯一元组的数量,其中三个数字可以连续或随机选取,但在拾取时遵循相同的数组顺序。
例如,考虑一个数组[1, 4, 1, 1, 1, 2]
三个数字的所有唯一元组是:
[1, 4, 1]
[1, 4, 2]
[1, 1, 1]
[1, 1, 2]
[4, 1, 1]
[4, 1, 2]
所以答案是6。
我需要一种算法来解决这个问题。
答案 0 :(得分:1)
解决新问题。这称为完整搜索算法。复杂性为O(n^3 log (n))
。
int n;
cin >> n;
vi a(n);
for(int i = 0; i < n; i++) cin >> a[i];
int last1 = INF, last2 = INF, last3 = INF;
int count = 0;
set <int> s1;
set <pair<int, int>> s2;
set <tuple <int, int, int> > s3;
for(int i = 0; i < n; i++) {
if(s1.count(a[i])) continue;
s1.insert(a[i]);
for(int j = i + 1; j < n; j++) {
if(s2.count({a[i], a[j]})) continue;
s2.insert({a[i], a[j]});
for(int k = j + 1; k < n; k++) {
if(s3.count({a[i], a[j], a[k]})) continue;
s3.insert({a[i], a[j], a[k]});
count++;
cout << a[i] << " " << a[j] << " " << a[k] << "\n";
last3 = a[k];
}
last2 = a[j];
}
last1 = a[i];
}
cout << count << "\n";
答案 1 :(得分:1)
这是你在找什么?
int n;
cin >> n;
vi a(n);
for(int i = 0; i < n; i++) {
cin >> a[i];
}
set <tuple<int, int, int> > set1;
for(int i = 0; i < n - 2; i++) {
tuple <int, int, int> c = {a[i], a[i + 1], a[i + 2]};
if(!set1.count(c)) set1.insert(c);
}
cout << set1.size() << "\n";
for(auto el: set1) {
cout << get<0> (el) << " " << get<1> (el) << " " << get <2> (el) << "\n";
}
答案 2 :(得分:0)
我有一个算法,其可用性取决于您使用的语言。
我正在编写我的答案,参考C ++。 因此,如果数组的条目严格小于1,000,000,那么你可以使用我的想法。所以它在这里:
基本思想是将3个数字的元组(比如a,b和c按顺序)存储为k = 10 ^ 12 * a + 10 ^ 6 * b + c。
所以每个独特的k都将是一个独特的元组,你可以通过
获得a = k / 10 ^ 12
b =(k / 10 ^ 6)%10 ^ 6
c = k%10 ^ 6
所以例如a = 123,b = 58469和c = 12然后k = 123058469000012
和a,b,c可以恢复为k / 10 ^ 12 = 123,(k / 10 ^ 6)%10 ^ 6 = 058469和k%10 ^ 6 = 000012
为获得k,你可以在三个嵌套循环中迭代数组。
对于唯一k的计数,您可以使用任何数据结构,如地图,集等,具体取决于您的编程语言。
如果元素较大,你可以简单地在三个嵌套循环中遍历数组并将数字存储在say std :: pair&lt;长,对&lt;长,长长&gt; &GT; (C ++中的数据结构)然后你可以再次使用数据结构,如set,map等来计算唯一对。
P.S。 :我没有编写代码,因为没有指定语言,但希望我的想法有所帮助。