我正在研究2-sum问题,我认为我的解决方案非常有效,但在我运行之后,该程序显然花了太长时间。这是我的代码:
public int[] twoSum(int[] numbers, int target) {
int [] original = new int[numbers.length];
for(int i=0; i<numbers.length; i++){
original[i] = numbers[i];
}
Arrays.sort(numbers);
int [] returnArray = new int[2];
int left = 0;
int right = numbers.length-1;
int found1 = 0, found2 = 0;
int index1 = 1, index2 = numbers.length-1;
for (;left<right;){
if(numbers[left] + numbers[right] == target){
found1 = numbers[left];
found2 = numbers[right];
break;
}
else if(numbers[left] + numbers[right] < target){
left++;
}
else{
right--;
}
}
for(;index1<index2;){
if(original[index1] == found1){
returnArray[0] = index1+1;
}
else{
index1 ++;
}
if(original[index2] == found2){
returnArray[1] = index2+1;
}
else{
index2 --;
}
}
return returnArray;
}
问题表明
您可以假设每个输入都只有一个解决方案。函数twoSum应返回两个数字的索引,以便它们加起来到目标,其中index1必须小于index2。请注意,您返回的答案(index1和index2)不是从零开始的。
我的想法是先对数组进行排序,然后找到这两个元素,然后是两个索引。我认为有必要先存储原始数组,因为排序会改变数组。我解决方案的哪一部分很慢?
P.S。我不经常使用Java,随意指出我的错误。
感谢。
答案 0 :(得分:0)
你在这里有两个通行证。一个用于查找数字,另一个用于记住原始索引。
如果您首先保留了索引,则可以避免第二次传递。
从包含i..e {1,2,3,4,...}的索引的数组开始,然后使用非默认比较器对其进行排序:
sort(T[] a, Comparator<? super T> c)
让比较器使用原始数组中的值对索引进行排序。
然后在索引上运行你的二和,你已经有了索引值。