Skip to content

Commit a35a01f

Browse files
Soloydenko-CSoloydenko-C
Soloydenko-C
authored and
Soloydenko-C
committed
Add LeetCode-1 twoSum
1 parent fe7b884 commit a35a01f

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

__tests__/1-two-sum.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import twoSum from '../src/leet-code/1-easy/1-two-sum';
2+
3+
describe(twoSum.name, () => {
4+
[
5+
{ nums: [1, 2], target: 3, expected: [0, 1] },
6+
{ nums: [1, 2, 3], target: 4, expected: [0, 2] },
7+
{ nums: [1, 2, 3], target: 5, expected: [1, 2] },
8+
{ nums: [1, 2, 3], target: 3, expected: [0, 1] },
9+
{ nums: [3, 3], target: 6, expected: [0, 1] },
10+
].forEach(({ nums, target, expected}) => {
11+
it(`should return ${JSON.stringify({ expected })} for ${JSON.stringify({ nums })} and ${JSON.stringify({ target })}`, () => {
12+
expect(twoSum(nums, target)).toEqual(expected);
13+
});
14+
});
15+
});

src/leet-code/1-easy/1-two-sum.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
Given an array of integers, return **indices** of the two numbers such that they add up to a specific target.
3+
4+
You may assume that each input would have ***exactly*** one solution, and you may not use the same element twice.
5+
6+
**Example:**
7+
8+
```
9+
Given nums = [2, 7, 11, 15], target = 9,
10+
11+
Because nums[0] + nums[1] = 2 + 7 = 9,
12+
return [0, 1].
13+
```
14+
*/
15+
16+
var twoSum = function(nums: number[], target: number): number[] {
17+
const valuesAndIndices = nums.reduce((subResult, value, index) => {
18+
const indices = subResult[value];
19+
indices ? indices.push(index) : subResult[value] = [index];
20+
return subResult;
21+
}, { } as { [_: string]: number[] });
22+
23+
const sortedNums = [...nums].sort((a, b) => a - b);
24+
25+
const restoreOriginalIndex = (indexInSorted: number): number => valuesAndIndices[sortedNums[indexInSorted].toString()].shift() as number;
26+
27+
let left = 0;
28+
let right = left + 1;
29+
while (true) {
30+
const sum = sortedNums[left] + sortedNums[right];
31+
if (sum === target) {
32+
return [ restoreOriginalIndex(left), restoreOriginalIndex(right) ];
33+
} else if (sum < target && right + 1 < sortedNums.length) {
34+
right += 1;
35+
} else {
36+
left += 1;
37+
right = left + 1;
38+
}
39+
}
40+
}
41+
42+
var twoSumBruteForce = function(nums: number[], target: number): number[] {
43+
for (let left = 0; left < nums.length - 1; left++)
44+
for (let right = left + 1; right < nums.length; right++)
45+
if (nums[left] + nums[right] === target)
46+
return [left, right];
47+
throw new Error(`Cheaters!`);
48+
};
49+
50+
export default twoSum;

0 commit comments

Comments
 (0)