我编写了以下代码来查找总和为 K 的两个元素
#include <iostream>
#include <unordered_map>
void sum_equal_to_k(int *a, int n, int k) { /* O(N) */
std::unordered_map<int, int> hash;
// insert all elements in a hash
for (int i = 0; i < n; i++) {
hash[a[i]] = 1;
}
// print if k - a[i] exists in the hash
for (int i = 0; i < n; i++) {
if (hash[k - a[i]] == 1) {
printf("%d %d\n", a[i], k - a[i]);
}
}
}
int main() {
int a[8] = {3, 5, 2, 1, 6, 7, 4};
sum_equal_to_k(a, 8, 7);
return 0;
}
我无法将其扩展为三元素和
该问题被称为3SUM
。有一个O(n^2)
您可以找到解决该问题的算法here http://en.wikipedia.org/wiki/3SUM#Quadratic_algorithm,这不需要任何哈希。
如果你只使用它会更简单vector
(您已经在使用unordered_map
无论如何,对吧?):
void sum3_k(std::vector<int> s, int k) {
std::sort(s.begin(), s.end());
for (size_t i = 0; i < s.size() - 2; ++i) {
size_t start = i + 1;
size_t end = s.size() - 1;
while (start < end) {
int sum = s[i] + s[start] + s[end];
if (sum == k) {
std::cout << s[i] << " " << s[start] << " " << s[end] << std::endl;
++start, --end;
}
else if (sum > k) {
--end;
}
else {
++start;
}
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)