对于输入的数组和目标整数,找到数组中的两个数加起来等于目标。
PS: 返回的是序号,且序号1必须小于序号2。且学号的返回不是以0为起点的。
PPS:可以假设必然存在答案。
暴力破解,每一对都算出来。这样需要O(n^2)的时间,肯定不行。
int[] ans = new int[2];
int n = numbers.length;
if(numbers == null || n < 2){
return ans;
}
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(numbers[i]+numbers[j]==target){
ans[0]=i+1;
ans[1]=j+1;
return ans;
}
}
}
return ans;
思路2
sort! 排序后,直接从两头开始算起,和target比,小的话,左边i++;大的话,右边j--;如此一来,所需要的比较时间为O(n),但是排序时间为O(nlgn)。之后,再对序号的做寻找和调整即可。网上找到的这篇很好,用了一个node类型,事先存储val和index的对应关系。
http://www.cnblogs.com/remlostime/archive/2012/11/15/2772251.html
HashMap
public class Solution {
public int[] twoSum(int[] numbers, int target) {
int[] ans = new int[2];
int n = numbers.length;
if(numbers == null || n ==0){
return ans;
}
HashMap<Integer,Integer> record = new HashMap<Integer,Integer>();
for(int i = 0; i < n;i++){
int other = target-numbers[i];
if(record.containsKey(other)){
ans[0]=record.get(other)+1;
ans[1]=i+1;
return ans;
}
else{
record.put(numbers[i],i);
}
}
return ans;
}
}