Problem
https://leetcode.com/problems/two-sum/
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
Solution
fun twoSum(nums: IntArray, target: Int): IntArray {
for (i in 0 until nums.size) {
for (j in i + 1 until nums.size) {
if (nums[i] + nums[j] == target) {
return intArrayOf(i, j)
}
}
}
throw IllegalArgumentException("No solution")
}
fun twoSum(nums: IntArray, target: Int): IntArray {
val map = HashMap<Int, Int>()
nums.forEachIndexed { idx, item ->
val found = map[target - item]
found?.let {
return intArrayOf(found, idx)
}
map[item] = idx
}
throw IllegalArgumentException("No solution")
}
Test code
@Test
fun twoSum() {
t(intArrayOf(2, 7, 11, 15), 9, intArrayOf(0, 1))
t(intArrayOf(3, 2, 4), 6, intArrayOf(1, 2))
}
private fun t(nums: IntArray, target: Int, expected: IntArray) {
val actual = solution.twoSum(nums, target)
assertEquals(expected.size, actual.size)
expected.forEachIndexed { index, i ->
assertEquals(expected[index], i)
}
}
Model solution
https://leetcode.com/problems/two-sum/solution/
Approach 1: Brute Force
public int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] == target - nums[i]) {
return new int[] { i, j };
}
}
}
throw new IllegalArgumentException("No two sum solution");
}
Approach 2: Two-pass Hash Table
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement) && map.get(complement) != i) {
return new int[] { i, map.get(complement) };
}
}
throw new IllegalArgumentException("No two sum solution");
}
Approach 3: One-pass Hash Table
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[] { map.get(complement), i };
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}
Top comments (0)