从正整数数组中查找三个数字的唯一集合的算法

时间:2018-06-11 09:15:37

标签: arrays algorithm numbers

我需要一个算法来查找正整数数组中三个数字的唯一元组的数量,其中三个数字可以连续或随机选取,但在拾取时遵循相同的数组顺序。

例如,考虑一个数组[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。

我需要一种算法来解决这个问题。

3 个答案:

答案 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。 :我没有编写代码,因为没有指定语言,但希望我的想法有所帮助。