这个问题是在Google的编程面试中提出的。我想到了两种方法:
找到所有长度为n的子序列,计算两个元素的和并检查它是否等于k。如果是,则打印Yes,否则继续搜索。这是一种暴力的方法。
将数组按非递减顺序排序。然后从其右侧开始遍历数组。假设我们有一个已排序的数组{3,5,7,10},我们想让总和为17。我们将从元素10开始,索引=3,用“j”表示索引。然后包括当前元素并计算required_sum = sum-current_element。之后,我们可以在array [0-(j-1)] 中执行二元或三元搜索,以查找其值等于required_sum的元素。如果我们找到这样的元素,那么我们可以停止搜索,因为我们已经找到了一个长度为2且总和为给定总和的子序列。如果我们没有找到这样的元素,则将j的索引减小,并针对长度为length-1的结果子数组(在这种情况下排除索引3处的元素)重复上述步骤。
这里我们考虑到数组可能包含负数和正数整数。
您能推荐比这更好的解决方案吗?也许是DP方案?一个能进一步减少时间复杂度的解决方案。
O(n)
,空间复杂度也为O(n)
的算法。对于每个元素,检查它是否存在于哈希表中。如果不存在,则将k-arr[i]
存储起来,并继续下一个元素。 - thebenman