Two Sum
Given an array of integers, find two numbers such that they add up to a specific target number.
The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.
You may assume that each input would have exactly one solution.
Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2
标签: Array Hash Table
(以下仅是自己记录学习)
解析:
1、可以复制原数组并排序,对排序后的数组两头start和end指针同时扫描,找到结果后再在原数组中找到下标,
时间复杂度取决于数组排序O(N lg N)时间
<span style="font-family:Microsoft YaHei;"> public int[] twoSum(int[] numbers, int target) {
int[] result = new int[2];
int[] data = new int[numbers.length];
for(int i=0; i<numbers.length; i++) {
data[i] = numbers[i];
}
Arrays.sort(data);
int start = 0;
int end = data.length - 1;
while(start < end) {
if(data[start] + data[end] > target) {
end --;
} else if(data[start] + data[end] < target) {
start ++;
} else {
int k = 0;
for(int i=0; i<numbers.length && k < 2; i++) {
if(numbers[i] == data[start] || numbers[i] == data[end]) {
result[k++] = i + 1;
}
}
break;
}
}
return result;
}</span>
2、使用hashmap记录数组元素的值与下标记录,则只需要O(N)时间
public int[] twoSum2(int[] data, int target) {
int[] result = new int[2];
boolean flag = false;
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i=0; i<data.length; i++) {
if(map.get(data[i]) != null) {
if(target == (data[i] * 2)) {
result[0] = i + 1;
result[1] = map.get(data[i]) + 1;
flag = true;
break;
}
}
map.put(data[i], i);
}
if(flag == false) {
for(int i=0; i<data.length; i++) {
if(map.containsKey(target - data[i]) && map.get(target - data[i]) != i) {
result[0] = i + 1;
result[1] = map.get(target - data[i]) + 1;
break;
}
}
}
if(result[0] > result[1]) {
int tmp = result[0];
result[0] = result[1];
result[1] = tmp;
}
return result;
}