【发布时间】:2018-12-20 08:57:24
【问题描述】:
这个问题是在 Google 编程面试中提出的。我想到了两种相同的方法:
查找长度的所有子序列。这样做时计算两个元素的和并检查它是否等于 k。如果是,打印是,否则继续搜索。这是一种蛮力方法。
按非降序对数组进行排序。然后从右端开始遍历数组。假设我们有排序数组 {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)时空算法。对于每个元素,检查它是否存在于 hashmap 中。如果没有,' 存储k - arr[i]并移动到下一个元素。 -
字典和 sum 的含义使这个问题变得棘手。
-
数组中的数字可以重复吗?
-
我看到的问题的版本中还包括必须1遍完成的要求。
标签: arrays algorithm time-complexity dynamic-programming subsequence