我想办法解决问题,其中包含以下代码:
package samueg.algorithm;
public class Main {
public static void main(String[] args) {
int[] numbers = new int[] { -1, 3, 7, 2, 4, 5, -8, 9 };
int sum = 14;
int targetIndex1 = -1, targetIndex2 = -1;
for (int i = 0; i < numbers.length; ++i) {
// for (int j = 0; j < i; ++j) {
// if (numbers[i] + numbers[j] == sum) {
// targetIndex1 = i;
// targetIndex2 = j;
// break;
// }
// }
for (int j = (i + 1); j < numbers.length; ++j) {
if (numbers[i] + numbers[j] == sum) {
targetIndex1 = i;
targetIndex2 = j;
break;
}
}
if (targetIndex1 != -1 && targetIndex2 != -1) {
System.out.println(String.format("%1$d + %2$d = %3$d",
numbers[targetIndex1], numbers[targetIndex2], sum));
return;
}
}
System.out.println("No targets which satisfy the condition are found.");
}
}
评论代码不是必需的,因为他们所做的判断已经为索引i完成了。 我想知道这个算法是否有效,如果不是,有人能告诉我一个更好的算法吗?感谢。
答案 0 :(得分:3)
使用哈希表:
对于每个号码n
:
检查哈希表中是否有target number - n
。如果是,我们发现两个数字相加到目标数字。
将n
插入哈希表。
复杂性:预期O(n)
(由于循环加倍,您的方法为O(n2)
。
答案 1 :(得分:1)
对数组进行排序,设置两个指针并分别移动它们。这应该给你一个O(n log(n))解决方案。我不擅长java,所以让我python:
def find_indexes(A, s):
A = sorted(A)
p1 = 0
p2 = len(A) - 1
while not A[p1] + A[p2] == s and p1 < len(A) and p2 >= 0:
if A[p1] + A[p2] < s:
p1 = p1 + 1
if A[p1] + A[p2] > s:
p2 = p2 - 1
if A[p1] + A[p2] == s:
return (p1,p2)
return None