数组中元素的组合返回总和

Posted

技术标签:

【中文标题】数组中元素的组合返回总和【英文标题】:Combination of elements in an array returning sum 【发布时间】:2017-05-22 17:22:46 【问题描述】:

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

为此,我已经考虑过手头的问题。

我有一个类似的数组: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。

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

【问题讨论】:

如果您的代码运行良好,而您只是想改进它:您的问题超出了 SO 的范围,最好在 codereview.stackexchange.com 上提问。 @AlgirdasPreidžius...我不知道 SE 的 codereview 部分。谢谢,我会把它移到那里。 使用集合数据结构。循环遍历元素,然后测试k-n 是否在集合中。 这也称为“2-SUM”。我会给出一些链接,但是有很多。 @statisticalbeginner -- 1) 这可以在O(n) 中完成。 2) 这并不像您认为的那样工作 -- int size = sizeof(movies); -- 数组在传递时会衰减为指针,在该行中,您要求 sizeof(int *) 【参考方案1】:

你可以及时做到这一点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)

【讨论】:

以上是关于数组中元素的组合返回总和的主要内容,如果未能解决你的问题,请参考以下文章

给定一个数字列表,如何创建总和的所有组合并返回这些总和的列表

LeetCode 0377. 组合总和 Ⅳ

377. 组合总和 Ⅳ

377. 组合总和 Ⅳ(背包dp)

39. 组合总和

组合总和-Leetcode