forked from TheAlgorithms/Java
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add two sum problem (TheAlgorithms#4364)
* add two sum problem * linter solved * linter solved * improve code * linter solved * improve code * mini linter solved * update code --------- Co-authored-by: Piotr Idzik <[email protected]>
- Loading branch information
1 parent
94621fb
commit 34cf6da
Showing
2 changed files
with
94 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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(); | ||
} | ||
} |
61 changes: 61 additions & 0 deletions
61
src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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()); | ||
} | ||
} |