Arrays 从正整数数组中寻找三个数的唯一集的算法

Arrays 从正整数数组中寻找三个数的唯一集的算法,arrays,algorithm,numbers,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 我需要一个算法来解决这个问题。新问题的解决方案。这称为完全搜索算法。复杂性是O(n^3 log(n)) intn; cin>>n; vi a(n); 对于(inti=0;

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

例如考虑数组<代码> [ 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


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

新问题的解决方案。这称为完全搜索算法。复杂性是
O(n^3 log(n))

intn;
cin>>n;
vi a(n);
对于(inti=0;i>a[i];
int last1=INF,last2=INF,last3=INF;
整数计数=0;
设s1;
设s2;
设s3;
对于(int i=0;i这就是你要找的吗

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";
}
intn;
cin>>n;
vi a(n);
对于(int i=0;i>a[i];
}
设置set1;
对于(int i=0;i我有一个算法,它的可用性取决于你使用的语言

我正在参考C++写我的答案。 因此,如果数组的条目严格小于1000000,那么您可以使用我的想法。因此,它是这样的:

其基本思想是将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=12305846900012

a,b,c可回收为k/10^12=123,(k/10^6)%10^6=058469和k%10^6=000012

为了获得k,可以在三个嵌套循环中迭代数组

为了计算唯一的k,您可以使用任何数据结构,如map、set等,具体取决于您的编程语言

如果元素较大,您可以简单地在三个嵌套循环中遍历数组,并将数字存储在例如std::pair>(C++中的一种数据结构)中,然后您可以再次使用set、map等数据结构来计算唯一对


我没有编写代码,因为没有指定语言,但希望我的想法有帮助。

谢谢Satvik!我如何在MAC上运行这个代码?请告诉我你的算法,这就是我真正需要的。这是C++语言。算法是用一个特殊的数据结构来完成的,它被称为红黑树。uages.这里它被用作set.完整的mac代码为ideone上的代码创建一个.cpp文件,看看这个我也认为我的代码只适用于原始问题,它只允许连续的.22次视图和3次否决票。如果你需要任何澄清,就这么问吧。这个问题很容易理解和攻击。我希望否决的voTE来自于你明显缺乏研究或试图解决。@修剪可能是这样。完全C++代码。虽然我使用C++ STD::SET。你也可以使用STD::unordeDeSt-集,它相当于哈希,如果你想要整个算法,它会更容易理解。
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";
}