一. 问题
给定一个整数 c 和一个下标从 1 到 n 的数组 A,A 中的元素是范围 1 到 5n(可能有重复)的 n 个整数。描述一个有效算法来确定 A 中是否存在两个整数 A[ i ] 和 A[ j ] ,其和为 c,即 c = A[ i ] + A[ j ], 1 ≤ i < j ≤ n。算法的运行时间是多少?
二. 思路
用简洁的话重新表述一下问题:在序列是否存在两个数,它们的和等于给定的整数,若存在,返回 true,不存在,返回 false。
我们考虑暴力解法,先固定一个数,然后依次查找另外一个数,判断这两个数的和是否等于给定整数。这样遍历序列找出结果,时间复杂度为 O(n2)。
三. 代码实现
1 bool is_two_num_exist(const vector<int>& data, int sum) { 2 for (int i = 0; i < data.size(); ++i) { 3 for (int j = i + 1; j < data.size(); ++j) { 4 if ((data[i] + data[j]) == sum) { 5 return true; 6 } 7 } 8 } 9 10 return false; 11 }
显然,该暴力解法并不是最好的方法。算法的时间复杂度并不好看,还需优化。