algorithm - 从数组中找到一对元素,其总和等于给定数

标签 algorithm

给定 n 个整数数组和一个数字 X,找到所有唯一的元素对 (a,b),其总和等于 X。

下面是我的解决方案,是O(nLog(n)+n),但我不确定它是否是最优的。

int main(void)
{
    int arr [10] = {1,2,3,4,5,6,7,8,9,0};
    findpair(arr, 10, 7);
}
void findpair(int arr[], int len, int sum)
{
    std::sort(arr, arr+len);
    int i = 0;
    int j = len -1;
    while( i < j){
        while((arr[i] + arr[j]) <= sum && i < j)
        {
            if((arr[i] + arr[j]) == sum)
                cout << "(" << arr[i] << "," << arr[j] << ")" << endl;
            i++;
        }
        j--;
        while((arr[i] + arr[j]) >= sum && i < j)
        {
            if((arr[i] + arr[j]) == sum)
                cout << "(" << arr[i] << "," << arr[j] << ")" << endl;
            j--;
        }
    }
}

最佳答案

此解决方案有 3 种方法:

令总和为T,n为数组大小

方法一:
这样做的天真方法是检查所有组合(n 选择 2)。这种详尽的搜索是 O(n2)。

方法 2:
更好的方法是对数组进行排序。这需要 O(n log n)
然后对于数组 A 中的每个 x, 使用二进制搜索查找 T-x。这将花费 O(nlogn)。
所以,整体搜索是 O(n log n)

方法 3:
最好的办法 将是将每个元素插入哈希表(不排序)。这将 O(n) 作为常数时间插入。
然后对于每个 x, 我们可以只查找它的补码 T-x,它的复杂度为 O(1)。
总的来说,这种方法的运行时间是 O(n)。


您可以引用更多 here 。谢谢。


关于algorithm - 从数组中找到一对元素,其总和等于给定数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4720271/

相关文章:

algorithm - 有哪些非常适合整数线性规划的问题示例?

python - 有没有好的方法来进行这种类型的挖掘?

algorithm - 三叉树与哈希表

c - 为什么我在这个问题上得到了错误的答案(Uva OJ 455)

javascript - 如何重构以从同一个函数中获取两个值?

algorithm - 当我知道访问每个元素的所有概率时,我应该使用什么搜索树

algorithm - 从 SHA-512 哈希生成的字符不会保存到数据库中

通过交换第一个整数在排列之间移动的算法

c++ - 从前序遍历迭代构建二叉搜索树(非递归)

algorithm - 为什么 Radix sort 比 C 中的 Quick sort 有更多的指令?