【问题标题】:Algorithm for finding unique sets of three numbers from an array of positive integers从正整数数组中找到三个数字的唯一集合的算法
【发布时间】:2018-11-20 11:54:03
【问题描述】:

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

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

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

【问题讨论】:

  • 22 次浏览和 3 次反对。如果您需要任何说明,请直接询问。
  • 这个问题很容易理解和攻击。我预计投反对票的原因是您明显缺乏研究或尝试解决问题。
  • @Prune 可能是这样。

标签: arrays algorithm numbers


【解决方案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";
}

【讨论】:

  • 感谢 Satvik!如何在 Mac 上运行它?另外请告诉我你的算法,这就是我真正需要的。
  • 这是用 C++ 编写的。该算法是使用称为红黑树的特殊数据结构的完整搜索,默认情况下在大多数语言中实现。在这里它被用作集合。完整代码ideone.com/LYJ0kN
  • 对于 mac,为 ideone 上的代码创建一个 .cpp 文件并查看此stackoverflow.com/questions/221185/…
  • 我也认为我的代码只适用于只允许连续的原始问题。
【解决方案2】:

新问题的解决方案。这称为完全搜索算法。复杂度是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";

【讨论】:

  • ideone.com/mk78Zf 完整的 c++ 代码。虽然我使用的是 c++ std::set。你也可以使用 std::unordered_set ,它相当于散列,如果出于某种原因你想要整个算法,会更容易理解。
【解决方案3】:

我有一个算法,其可用性取决于您使用的语言。

我正在参考 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,您可以使用任何数据结构,如 map、set 等,具体取决于您的编程语言。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多