arrays - 给定一个数字列表和一个数字 k,返回列表中的任意两个数字是否相加为 k

标签 arrays algorithm time-complexity dynamic-programming subsequence

这个问题是在谷歌编程面试中被问到的。我想到了两种相同的方法:

  1. 找到长度为的所有子序列。在这样做的同时计算两个元素的总和,并检查它是否等于 k。如果是,打印 Yes,否则继续搜索。这是一种蛮力方法。

  2. 按非递减顺序对数组进行排序。然后从右端开始遍历数组。假设我们有排序数组 {3,5,7,10},我们希望总和为 17。我们将从元素 10 开始,索引 = 3,让我们用“j”表示索引。然后包含当前元素并计算 required_sum= sum - current_element。之后,我们可以在数组[0-(j-1)]中进行二元或三元查找,查找是否存在值等于required_sum的元素。如果我们找到这样一个元素,我们可以打破,因为我们已经找到了一个长度为 2 的子序列,其总和是给定的总和。如果我们没有找到任何这样的元素,则减少 j 的索引并重复上述步骤以获得 length = length-1 的结果子数组,即在这种情况下排除索引 3 处的元素。

这里我们考虑了数组可以有正整数也可以有负整数。

您能提出比这更好的解决方案吗?也许是 DP 解决方案?一种可以进一步降低其时间复杂度的解决方案。

最佳答案

这道题用时间空间复杂度为O(N)的集合很容易解决。首先将数组中的所有元素加入集合中,然后遍历数组中的每个元素,判断K-ar[i]是否为存在与否。

这是复杂度为 O(N) 的 java 代码:

boolean flag=false;
HashSet<Long> hashSet = new HashSet<>();
for(int i=0;i<n;i++){
    if(hashSet.contains(k-ar[i]))flag=true;
    hashSet.add(ar[i]);
}
if(flag)out.println("YES PRESENT");
else out.println("NOT PRESENT");

关于arrays - 给定一个数字列表和一个数字 k,返回列表中的任意两个数字是否相加为 k,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51300360/

相关文章:

c - 左值 : array and structure

algorithm - 递归函数分析中的递归调用次数

java - 在二维数组中搜索 O(n) 未排序的行

ios - NSString 到 byte Array,操作它,以及 byte Array 到 NSString

javascript - 在 innerhtml 上使用 getElementbyid# 方法的 polymer

algorithm - 回溯算法设计技术定义

php - MySQL - 在数据库复杂性中查找表

algorithm - O(nlogn) + O(n) 的时间复杂度是否只是 O(nlogn)?

c - 有效地对结构数组进行排序

c++ - 表示小波的数据结构