Repository: TheAlgorithms/Java
Pull request #4364 (2023-09-10 09:03:56)

add two sum problem
<!-- For completed items, change [ ] to [x] -->

- [x] I have read [CONTRIBUTING.md](https://github.com/TheAlgorithms/Java/blob/master/CONTRIBUTING.md).
- [x] This pull request is all my own work -- I have not plagiarized it.
- [x] All filenames are in PascalCase.
- [x] All functions and variable names follow Java naming conventions.
- [x] All new algorithms have a URL in their comments that points to Wikipedia or other similar explanations.


BamaCharanChhandogi: @siriak please check.
BamaCharanChhandogi: @siriak check!

Patch:
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<Pair<Integer, Integer>> twoSum(final int[] values, final int target) {
+        HashMap<Integer, Integer> 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();
+    }
+}


Test patch:
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());
+    }
+}