【发布时间】:2016-11-18 22:43:55
【问题描述】:
我正在尝试解决一个非常有趣的编程挑战,但我有点不知道为什么我的代码会失败。这里是:
写一个函数,给定一个列表和一个目标总和,返回 总和等于的任何两个不同元素的从零开始的索引 目标总和。如果没有这样的元素,函数应该 返回空值。 例如, findTwoSum(new int[] { 1, 3, 5, 7, 9 }, 12) 应该返回以下任何索引元组:
1, 4 (3 + 9 = 12) 2, 3 (5 + 7 = 12) 3, 2 (7 + 5 = 12) 4, 1 (9 + 3 = 12)
应该很简单吧?所以这是我的功能:
public static int[] findTwoSum(int[] list, int sum) {
int[] indices = null;
for(int i = 0; i < list.length; i++) {
int currentNum = list[i];
int findNum = sum - currentNum;
int length = list.length;
int min = i;
int max = length-1;
while(max >= min) {
int guess = (max+min)/2;
if(list[guess] == findNum) {
return new int[] {i,guess};
}
if(list[guess] < findNum) {
min = guess + 1;
}
if(list[guess] > findNum) {
max = guess - 1;
}
}
}
return indices;
}
代码非常简单,对于数组中的每个元素,它会尝试使用二进制搜索找到另一个元素,以便它们的总和等于提供的sum。我已经测试了这段代码,但我找不到失败的场景,假设提供的数组已排序。但是,当我在 TestDome 上运行此代码时,最后一种情况失败了,这是某种错误的解决方案。有人能指出这种方法有什么问题吗?
【问题讨论】:
-
该问题要求列表的两个 distinct 元素,您的代码似乎无法正确处理。
-
@Gassa 是的,我也有检查过,它真的没有帮助。我现在在想的是,可能是数组在最后一种情况下没有排序。
-
给定的列表是否已经排序?
-
@User_Targaryen 我预计会这样,但我可能错了。所以我想我需要先对其进行排序并跟踪原始索引。
-
@Zed:那肯定是问题所在......