Skip to content

add two sum problem #4364

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Sep 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions src/main/java/com/thealgorithms/misc/TwoSumProblem.java
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 src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java
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());
}
}