题目要求:
解法一:
暴力破解,求出所有两两组合的和,与targetSum做比较。Return结果。
Time: O(n^2) Space: O(1)
代码:
import java.util.*;
class Program {
public static int[] twoNumberSum(int[] array, int targetSum) {
// Write your code here.
if (array == null || array.length < 2) return new int[0];
for (int i = 0; i < array.length - 1; i++) {
int temp = targetSum - array[i];
for (int j = i + 1; j < array.length; j++) {
if (temp != array[j]) continue;
return new int[]{array[i], array[j]};
}
}
return new int[0];
}
}
解法二:
利用HashSet去重,算出targetSum - num的值并存入set中,如果再次遇到,说明存在两数字的和,等于targetSum.
Time: O(n) Space: O(n)
代码:
import java.util.*;
class Program {
public static int[] twoNumberSum(int[] array, int targetSum) {
// Write your code here.
if (array == null || array.length < 2) return new int[0];
HashSet<Integer> set = new HashSet<>();
for (int num : array) {
int temp = targetSum - num;
if (set.contains(temp)) {
return new int[]{temp, num};
}
set.add(num);
}
return new int[0];
}
}
解法三:
Sort数组,通过二分查找,看是否可以找到两数之和等于targetSum的情况。如果和小于target: left++, 如果和大于target: right–.
Time: O(nlogn) Space: O(1)
代码:
import java.util.*;
class Program {
public static int[] twoNumberSum(int[] array, int targetSum) {
// Write your code here.
if(array == null || array.length < 2) return new int[0];
Arrays.sort(array);
int left = 0;
int right = array.length - 1;
while (left < right) {
int temp = array[left] + array[right];
if (temp == targetSum) {
return new int[] {array[left], array[right]};
} else if (temp < targetSum) {
left++;
} else {
right--;
}
}
return new int[0];
}
}