## 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)