diff --git a/src/main/java/com/thealgorithms/misc/TwoSumProblem.java b/src/main/java/com/thealgorithms/misc/TwoSumProblem.java new file mode 100644 index 00000000..ceeb3717 --- /dev/null +++ b/src/main/java/com/thealgorithms/misc/TwoSumProblem.java @@ -0,0 +1,33 @@ +package com.thealgorithms.misc; + +import java.util.HashMap; +import java.util.Optional; +import org.apache.commons.lang3.tuple.Pair; + +public final class TwoSumProblem { + private TwoSumProblem() { + } + + /** + * The function "twoSum" takes an array of integers and a target integer as input, and returns an + * array of two indices where the corresponding elements in the input array add up to the target. + * @param values An array of integers. + * @param target The target is the sum that we are trying to find using two numbers from the given array. + * @return A pair or indexes such that sum of values at these indexes equals to the target + * @author Bama Charan Chhandogi (https://github.com/BamaCharanChhandogi) + */ + + public static Optional> twoSum(final int[] values, final int target) { + HashMap valueToIndex = new HashMap<>(); + for (int i = 0; i < values.length; i++) { + final var rem = target - values[i]; + if (valueToIndex.containsKey(rem)) { + return Optional.of(Pair.of(valueToIndex.get(rem), i)); + } + if (!valueToIndex.containsKey(values[i])) { + valueToIndex.put(values[i], i); + } + } + return Optional.empty(); + } +} diff --git a/src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java b/src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java new file mode 100644 index 00000000..86e73ac0 --- /dev/null +++ b/src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java @@ -0,0 +1,61 @@ +package com.thealgorithms.misc; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +import org.apache.commons.lang3.tuple.Pair; +import org.junit.jupiter.api.Test; + +/** + * Test case for Two sum Problem. + * @author Bama Charan Chhandogi (https://github.com/BamaCharanChhandogi) + */ + +public class TwoSumProblemTest { + + @Test + void testTwoSumExists() { + final int[] values = new int[] {2, 7, 11, 15}; + final int target = 9; + final var expected = Pair.of(0, 1); // values[0] + values[1] = 2 + 7 = 9 + assertEquals(expected, TwoSumProblem.twoSum(values, target).get()); + } + + @Test + void testTwoSumNoSolution() { + final int[] values = new int[] {2, 7, 11, 15}; + final int target = 3; + assertFalse(TwoSumProblem.twoSum(values, target).isPresent()); + } + + @Test + void testTwoSumMultipleSolutions() { + final int[] values = {3, 3}; + final int target = 6; + final var expected = Pair.of(0, 1); // values[0] + values[1] = 3 + 3 = 6 + assertEquals(expected, TwoSumProblem.twoSum(values, target).get()); + } + + @Test + void testTwoSumMultipleSolution() { + final int[] values = {3, 4, 3, 3}; + final int target = 6; + final var expected = Pair.of(0, 2); // values[0] + values[2] = 3 + 3 = 6 + assertEquals(expected, TwoSumProblem.twoSum(values, target).get()); + } + + @Test + void testTwoSumNegativeNumbers() { + final int[] values = {-1, -2, -3, -4, -5}; + final int target = -8; + final var expected = Pair.of(2, 4); // values[2] + values[4] = -3 + (-5) = -8 + assertEquals(expected, TwoSumProblem.twoSum(values, target).get()); + } + + @Test + void testTwoSumNoSolutionDuplicatedInputs() { + final int[] values = {0, 0, 0}; + final int target = 100; + assertFalse(TwoSumProblem.twoSum(values, target).isPresent()); + } +}