From a039b51eff65777f9ca895ce2a7f8a7b89f176c2 Mon Sep 17 00:00:00 2001 From: BamaCharanChhandogi Date: Sun, 10 Sep 2023 14:32:59 +0530 Subject: [PATCH 1/8] add two sum problem --- .../com/thealgorithms/misc/TwoSumProblem.java | 34 +++++++++++ .../thealgorithms/misc/TwoSumProblemTest.java | 56 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 src/main/java/com/thealgorithms/misc/TwoSumProblem.java create mode 100644 src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java 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 000000000000..189b864b0776 --- /dev/null +++ b/src/main/java/com/thealgorithms/misc/TwoSumProblem.java @@ -0,0 +1,34 @@ +package com.thealgorithms.misc; + +import java.util.*; + +public class 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 nums 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 The method `twoSum` returns an array of integers. + * + * @author Bama Charan Chhandogi (https://github.com/BamaCharanChhandogi) + */ + public static int[] twoSum(int[] arr, int target) { + HashMap map = new HashMap<>(); + for(int i=0;i Date: Sun, 10 Sep 2023 14:40:43 +0530 Subject: [PATCH 2/8] linter solved --- .../com/thealgorithms/misc/TwoSumProblem.java | 20 +++++++++---------- .../thealgorithms/misc/TwoSumProblemTest.java | 6 +++--- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/thealgorithms/misc/TwoSumProblem.java b/src/main/java/com/thealgorithms/misc/TwoSumProblem.java index 189b864b0776..f349a37ee3ce 100644 --- a/src/main/java/com/thealgorithms/misc/TwoSumProblem.java +++ b/src/main/java/com/thealgorithms/misc/TwoSumProblem.java @@ -2,33 +2,31 @@ import java.util.*; -public class TwoSumProblem{ +public class 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 nums 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 The method `twoSum` returns an array of integers. - * * @author Bama Charan Chhandogi (https://github.com/BamaCharanChhandogi) */ public static int[] twoSum(int[] arr, int target) { - HashMap map = new HashMap<>(); - for(int i=0;i map = new HashMap<>(); + for (int i = 0; i < arr.length; i++) { + map.put(arr[i], i); } - for(int i=0;i Date: Sun, 10 Sep 2023 14:50:50 +0530 Subject: [PATCH 3/8] linter solved --- src/main/java/com/thealgorithms/misc/TwoSumProblem.java | 2 +- src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/thealgorithms/misc/TwoSumProblem.java b/src/main/java/com/thealgorithms/misc/TwoSumProblem.java index f349a37ee3ce..201119ce4b6a 100644 --- a/src/main/java/com/thealgorithms/misc/TwoSumProblem.java +++ b/src/main/java/com/thealgorithms/misc/TwoSumProblem.java @@ -27,6 +27,6 @@ public static int[] twoSum(int[] arr, int target) { return new int[] {i, index}; } } - return new int[] {}; + return new int[] {}; } } diff --git a/src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java b/src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java index 4f852ecd780b..31bf2a3622e5 100644 --- a/src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java +++ b/src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java @@ -3,7 +3,6 @@ import static org.junit.jupiter.api.Assertions.assertArrayEquals; import org.junit.jupiter.api.BeforeEach; - import org.junit.jupiter.api.Test; /** From 241136c0f372781b19758e9d036df72a888161f0 Mon Sep 17 00:00:00 2001 From: BamaCharanChhandogi Date: Sun, 10 Sep 2023 17:43:13 +0530 Subject: [PATCH 4/8] improve code --- .../java/com/thealgorithms/misc/TwoSumProblem.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/thealgorithms/misc/TwoSumProblem.java b/src/main/java/com/thealgorithms/misc/TwoSumProblem.java index 201119ce4b6a..bb5a44666202 100644 --- a/src/main/java/com/thealgorithms/misc/TwoSumProblem.java +++ b/src/main/java/com/thealgorithms/misc/TwoSumProblem.java @@ -14,17 +14,13 @@ public class TwoSumProblem { public static int[] twoSum(int[] arr, int target) { HashMap map = new HashMap<>(); for (int i = 0; i < arr.length; i++) { - map.put(arr[i], i); - } - for (int i = 0; i < arr.length; i++) { - int arrP = arr[i]; - int rem = target - arrP; + int rem = target - arr[i]; if (map.containsKey(rem)) { int index = map.get(rem); - if (index == i) { - continue; - } - return new int[] {i, index}; + return new int[] {index, i}; + } + if( !map.containsKey(arr[i])) { + map.put(arr[i], i); } } return new int[] {}; From 4569fddbc27a27918e541a200b64b06a41c207d6 Mon Sep 17 00:00:00 2001 From: BamaCharanChhandogi Date: Sun, 10 Sep 2023 17:44:56 +0530 Subject: [PATCH 5/8] linter solved --- src/main/java/com/thealgorithms/misc/TwoSumProblem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/thealgorithms/misc/TwoSumProblem.java b/src/main/java/com/thealgorithms/misc/TwoSumProblem.java index bb5a44666202..12cc05613ab4 100644 --- a/src/main/java/com/thealgorithms/misc/TwoSumProblem.java +++ b/src/main/java/com/thealgorithms/misc/TwoSumProblem.java @@ -19,7 +19,7 @@ public static int[] twoSum(int[] arr, int target) { int index = map.get(rem); return new int[] {index, i}; } - if( !map.containsKey(arr[i])) { + if (!map.containsKey(arr[i])) { map.put(arr[i], i); } } From 231db9977d3932ae8ac801de18f85fc2789b95b5 Mon Sep 17 00:00:00 2001 From: BamaCharanChhandogi Date: Mon, 11 Sep 2023 01:29:27 +0530 Subject: [PATCH 6/8] improve code --- src/main/java/com/thealgorithms/misc/TwoSumProblem.java | 8 +++++--- .../java/com/thealgorithms/misc/TwoSumProblemTest.java | 8 ++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/thealgorithms/misc/TwoSumProblem.java b/src/main/java/com/thealgorithms/misc/TwoSumProblem.java index 12cc05613ab4..51f595bb3c1b 100644 --- a/src/main/java/com/thealgorithms/misc/TwoSumProblem.java +++ b/src/main/java/com/thealgorithms/misc/TwoSumProblem.java @@ -1,8 +1,10 @@ package com.thealgorithms.misc; -import java.util.*; +import java.util.HashMap; -public class TwoSumProblem { +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. @@ -11,7 +13,7 @@ public class TwoSumProblem { * @return The method `twoSum` returns an array of integers. * @author Bama Charan Chhandogi (https://github.com/BamaCharanChhandogi) */ - public static int[] twoSum(int[] arr, int target) { + public static int[] twoSum(final int[] arr, final int target) { HashMap map = new HashMap<>(); for (int i = 0; i < arr.length; i++) { int rem = target - arr[i]; diff --git a/src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java b/src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java index 31bf2a3622e5..535d6ecdf37b 100644 --- a/src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java +++ b/src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java @@ -43,6 +43,14 @@ void testTwoSumMultipleSolutions() { int[] result = TwoSumProblem.twoSum(nums, target); assertArrayEquals(expected, result); } + @Test + void testTwoSumMultipleSolution() { + int[] nums = {3, 4, 3, 3}; + int target = 6; + int[] expected = {0, 2}; // nums[0] + nums[2] = 3 + 3 = 6 + int[] result = TwoSumProblem.twoSum(nums, target); + assertArrayEquals(expected, result); + } @Test void testTwoSumNegativeNumbers() { From 945df21949132c1f85978afa8ab867c9f09f79ba Mon Sep 17 00:00:00 2001 From: BamaCharanChhandogi Date: Mon, 11 Sep 2023 01:31:23 +0530 Subject: [PATCH 7/8] mini linter solved --- src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java b/src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java index 535d6ecdf37b..abb64d252db1 100644 --- a/src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java +++ b/src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java @@ -43,7 +43,7 @@ void testTwoSumMultipleSolutions() { int[] result = TwoSumProblem.twoSum(nums, target); assertArrayEquals(expected, result); } - @Test + @Test void testTwoSumMultipleSolution() { int[] nums = {3, 4, 3, 3}; int target = 6; From 8901d79650a4801e712452c53c670fe6c3084839 Mon Sep 17 00:00:00 2001 From: BamaCharanChhandogi Date: Tue, 12 Sep 2023 02:09:36 +0530 Subject: [PATCH 8/8] update code --- .../com/thealgorithms/misc/TwoSumProblem.java | 27 ++++---- .../thealgorithms/misc/TwoSumProblemTest.java | 62 +++++++++---------- 2 files changed, 45 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/thealgorithms/misc/TwoSumProblem.java b/src/main/java/com/thealgorithms/misc/TwoSumProblem.java index 51f595bb3c1b..ceeb3717fd4a 100644 --- a/src/main/java/com/thealgorithms/misc/TwoSumProblem.java +++ b/src/main/java/com/thealgorithms/misc/TwoSumProblem.java @@ -1,30 +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 nums An array of integers. + * @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 The method `twoSum` returns an array of integers. + * @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 int[] twoSum(final int[] arr, final int target) { - HashMap map = new HashMap<>(); - for (int i = 0; i < arr.length; i++) { - int rem = target - arr[i]; - if (map.containsKey(rem)) { - int index = map.get(rem); - return new int[] {index, i}; + + 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 (!map.containsKey(arr[i])) { - map.put(arr[i], i); + if (!valueToIndex.containsKey(values[i])) { + valueToIndex.put(values[i], i); } } - return new int[] {}; + return Optional.empty(); } } diff --git a/src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java b/src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java index abb64d252db1..86e73ac0547c 100644 --- a/src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java +++ b/src/test/java/com/thealgorithms/misc/TwoSumProblemTest.java @@ -1,8 +1,9 @@ package com.thealgorithms.misc; -import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; -import org.junit.jupiter.api.BeforeEach; +import org.apache.commons.lang3.tuple.Pair; import org.junit.jupiter.api.Test; /** @@ -11,53 +12,50 @@ */ public class TwoSumProblemTest { - private int[] nums; - - @BeforeEach - void setUp() { - // Initialize the test data before each test case - nums = new int[] {2, 7, 11, 15}; - } @Test void testTwoSumExists() { - int target = 9; - int[] expected = {0, 1}; // nums[0] + nums[1] = 2 + 7 = 9 - int[] result = TwoSumProblem.twoSum(nums, target); - assertArrayEquals(expected, result); + 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() { - int target = 3; - int[] expected = {}; // No two elements sum up to 3 - int[] result = TwoSumProblem.twoSum(nums, target); - assertArrayEquals(expected, result); + final int[] values = new int[] {2, 7, 11, 15}; + final int target = 3; + assertFalse(TwoSumProblem.twoSum(values, target).isPresent()); } @Test void testTwoSumMultipleSolutions() { - int[] nums = {3, 3}; - int target = 6; - int[] expected = {0, 1}; // nums[0] + nums[1] = 3 + 3 = 6 - int[] result = TwoSumProblem.twoSum(nums, target); - assertArrayEquals(expected, result); + 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() { - int[] nums = {3, 4, 3, 3}; - int target = 6; - int[] expected = {0, 2}; // nums[0] + nums[2] = 3 + 3 = 6 - int[] result = TwoSumProblem.twoSum(nums, target); - assertArrayEquals(expected, result); + 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() { - int[] nums = {-1, -2, -3, -4, -5}; - int target = -8; - int[] expected = {2, 4}; // nums[2] + nums[4] = -3 + (-5) = -8 - int[] result = TwoSumProblem.twoSum(nums, target); - assertArrayEquals(expected, result); + 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()); } }