From a047db4e1579d88d5d4035bcbc37eff2931146ff Mon Sep 17 00:00:00 2001 From: Evan Ferrao Date: Thu, 5 Feb 2026 17:51:14 +0530 Subject: [PATCH] update and improve combination and subset --- Recursion/CombinationTwo.java | 3 +- Recursion/CombinationTwoAlternate.java | 73 +++++++++++++++++++ Recursion/SubsetTwo.java | 41 +++++++++++ ...uplicates.java => SubsetTwoAlternate.java} | 4 +- Recursion/{Subset.java => SubsetsOne.java} | 4 +- SubsetsTwo.java | 0 6 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 Recursion/CombinationTwoAlternate.java create mode 100644 Recursion/SubsetTwo.java rename Recursion/{SubsetsWithoutDuplicates.java => SubsetTwoAlternate.java} (93%) rename Recursion/{Subset.java => SubsetsOne.java} (93%) create mode 100644 SubsetsTwo.java diff --git a/Recursion/CombinationTwo.java b/Recursion/CombinationTwo.java index 00c094a..7b41866 100644 --- a/Recursion/CombinationTwo.java +++ b/Recursion/CombinationTwo.java @@ -1,5 +1,6 @@ // https://leetcode.com/problems/combination-sum-ii/ -import java.util.*; +i +mport java.util.*; class CombinationTwo { diff --git a/Recursion/CombinationTwoAlternate.java b/Recursion/CombinationTwoAlternate.java new file mode 100644 index 0000000..02e9c88 --- /dev/null +++ b/Recursion/CombinationTwoAlternate.java @@ -0,0 +1,73 @@ +// https://leetcode.com/problems/combination-sum-ii/ + +import java.util.*; + +class CombinationTwoAlternate { + + public static void findCombination(int currentIndex, List ds, + int[] candidates, int n, int target, + List> finalAnswer){ + + // If target reached + if (target == 0){ + finalAnswer.add(new ArrayList<>(ds)); + return; + } + + // If out of bounds OR target becomes negative + if (currentIndex == n || target < 0){ + return; + } + + // ---------------- INCLUDE ---------------- + if (candidates[currentIndex] <= target){ + ds.add(candidates[currentIndex]); + + // Move to next index (no reuse allowed) + findCombination(currentIndex + 1, ds, candidates, n, + target - candidates[currentIndex], finalAnswer); + + ds.remove(ds.size() - 1); + } + + // ---------------- EXCLUDE ---------------- + int nextIndex = currentIndex + 1; + + // Skip duplicates + while(nextIndex < n && candidates[nextIndex] == candidates[currentIndex]){ + nextIndex++; + } + + findCombination(nextIndex, ds, candidates, n, target, finalAnswer); + } + + public List> combinationSum2(int[] candidates, int target){ + + Arrays.sort(candidates); + + List> finalAnswer = new ArrayList<>(); + findCombination(0, new ArrayList<>(), candidates, + candidates.length, target, finalAnswer); + + return finalAnswer; + } +} + + +public class Main { + + public static void main(String[] args){ + + int[] candidates = {1,1,1,2,2}; + int target = 4; + + Solution sol = new Solution(); + + List> result = sol.combinationSum2(candidates, target); + + System.out.println("Unique Combinations:"); + for(List list : result){ + System.out.println(list); + } + } +} diff --git a/Recursion/SubsetTwo.java b/Recursion/SubsetTwo.java new file mode 100644 index 0000000..ca7aa97 --- /dev/null +++ b/Recursion/SubsetTwo.java @@ -0,0 +1,41 @@ +// https://leetcode.com/problems/subsets-ii/submissions/1909073945/ + +import java.util.*; + +class SubsetTwo { + + public void findSubsets(int ind, int[] nums, List ds, List> ansList) { + ansList.add(new ArrayList<>(ds)); + + for (int i = ind; i < nums.length; i++) { + if (i != ind && nums[i] == nums[i - 1]) continue; + + ds.add(nums[i]); + findSubsets(i + 1, nums, ds, ansList); + ds.remove(ds.size() - 1); + } + } + + public List> subsetsWithDup(int[] nums) { + Arrays.sort(nums); + List> ansList = new ArrayList<>(); + findSubsets(0, nums, new ArrayList<>(), ansList); + return ansList; + } +} + +public class Main { + public static void main(String[] args) { + + // Assumed Input + int[] nums = {1, 2, 2}; + + Solution sol = new Solution(); + List> result = sol.subsetsWithDup(nums); + + System.out.println("Subsets Without Duplicates:"); + for (List subset : result) { + System.out.println(subset); + } + } +} diff --git a/Recursion/SubsetsWithoutDuplicates.java b/Recursion/SubsetTwoAlternate.java similarity index 93% rename from Recursion/SubsetsWithoutDuplicates.java rename to Recursion/SubsetTwoAlternate.java index 8cd9e00..38733ad 100644 --- a/Recursion/SubsetsWithoutDuplicates.java +++ b/Recursion/SubsetTwoAlternate.java @@ -1,6 +1,8 @@ +// https://leetcode.com/problems/subsets-ii/submissions/1909073945/ + import java.util.*; -class SubsetsWithoutDuplicates { +class SubsetTwoAlternate { public static void printSubset(int currentIndex, List ds, int[] nums, int n, List> finalAnswer){ if (currentIndex == n){ diff --git a/Recursion/Subset.java b/Recursion/SubsetsOne.java similarity index 93% rename from Recursion/Subset.java rename to Recursion/SubsetsOne.java index 194c1d6..c7e638e 100644 --- a/Recursion/Subset.java +++ b/Recursion/SubsetsOne.java @@ -1,6 +1,8 @@ +// https://leetcode.com/problems/subsets/description/ + import java.util.*; -public class Subset { +public class SubsetsOne { public static void printSubset(int currentIndex, List ds, int[] nums, int n, List> finalAnswer){ if (currentIndex == n){ diff --git a/SubsetsTwo.java b/SubsetsTwo.java new file mode 100644 index 0000000..e69de29