c++ - 数组中元素的组合返回总和

标签 c++ algorithm sorting c++11

我正在使用数据结构学习优化问题。

为此,我考虑了一个手头的问题。

我有一个像这样的数组:movies[] = { 2,3,4,5,6,7,2,4,9 }

我有一个总和值:k = 5

现在我找到返回 "k" 的数组元素的组合 例如:

2 + 3 = 5
3 + 2 = 5

下面的代码可以做到这一点:

#include<iostream>
#include<tuple>
using namespace std;

std::tuple<int, int> movies_combo(int k,int movies[]) {
    int value_1 = 0, value_2 = 0;
    int size = sizeof(movies);

    //First lets sort the array in ascending order
    //For optimized solution
    double mid = sizeof(movies) / 2;

    //Second lets find the sum of combination of array elements which gives "k"
    for (int i = 0; i < (size-1); i++) {
        for (int j = 0; j < (size - 1); j++) {
            if (movies[i] + movies[j] == k) {

                cout << "The two movies are: " << movies[i] << "and" << movies[j] << endl;

            }
        }
    }
    return make_tuple(value_1, value_2);
}

int main() {
    int movies[] = { 2,3,4,5,6,7,2,4,9 };
    int k = 6;
    int value_1, value_2;

    tie(value_1,value_2) = movies_combo(k, movies);

    //cout << "The two movies are: " << value_1 << "and" << value_2 << endl;
}

现在我的时间复杂度是 O(n^2)。

我可以通过在开始时对数组进行排序并消除值 > k 来进一步降低复杂性。但这仅在几个场景中有用,而不是优化的一般解决方案。

我希望有一些数据结构和算法方法可以在这种情况下非常方便地降低对数级别示例的复杂性:nlogn 或 logn。

如果有人对降低时间复杂度有任何想法,请告诉我。

最佳答案

您可以在 O(nlogn) 甚至更好的 O(n) 时间内完成此操作。

O(nlogn) 方法:

1.在O(nlogn)时间内对元素进行排序

2。对于每个元素movies[i],应用 binary search 在数组中从位置 i+1 到数组末尾搜索元素 k - movies[i]

3。如果找到,您就有了元组,因为 movies[i] + (k - movies[i]) = k

O(n) 方法:

1.将所有元素存储在哈希表中。

2。对于每个元素 movies[i],在哈希表中搜索 k - movies[i],如果找到你的元组.

3。由于在哈希表中搜索需要 O(1) 时间,因此这种方法需要时间 O(n)

关于c++ - 数组中元素的组合返回总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44118732/

相关文章:

C++ 命名空间 : cross-usage

c++ - 带类的 SDL

c++ - 为什么需要为每一帧调用 OMSetRenderTargets DirectX 方法

java - 如何实现滑动窗口或者减少这些嵌套循环?

algorithm - 为什么对 LRU 缓存使用双向链表和 HashMap 而不是双端队列?

c++ - 是什么导致代码在 GPU 中运行?

algorithm - 至少有 3 个连续相同字符的二进制子串数

c++ - 按字典顺序从范围中获取下一个数字(没有所有字符串化的容器)

MySQL如何在排序查询结果时进行分组?

Python:修改列表的排序顺序