Two Sum with a HashMap
javaJavabeginnerinterview-prepjava
Find the two indexes whose values add up to a target in one pass, with the brute-force version for comparison.
import java.util.*;
public class TwoSum {
public static void main(String[] args) {
System.out.println(Arrays.toString(twoSum(new int[]{2, 7, 11, 15}, 9))); // [0, 1]
System.out.println(Arrays.toString(twoSum(new int[]{3, 2, 4}, 6))); // [1, 2]
System.out.println(Arrays.toString(twoSum(new int[]{3, 3}, 6))); // [0, 1]
System.out.println(Arrays.toString(twoSum(new int[]{1, 2}, 10))); // []
System.out.println(Arrays.toString(twoSumBruteForce(new int[]{2, 7, 11, 15}, 9))); // [0, 1]
}
// One pass, O(n) time and O(n) space: remember each value's index and look for the complement.
static int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> indexOf = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
Integer j = indexOf.get(target - nums[i]);
if (j != null) return new int[]{j, i};
indexOf.put(nums[i], i);
}
return new int[0];
}
// Two nested loops, O(n^2) time and O(1) space: the answer to give first, then improve.
static int[] twoSumBruteForce(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] == target) return new int[]{i, j};
}
}
return new int[0];
}
}