LeetCode - Combination Sum II | Darren's Blog



Given a collection of candidate numbers C and a target number T, find all unique combinations in C where the candidate numbers sums to T. Each number in C may only be used once in the combination.
  • All numbers (including target) will be positive integers.
  • Elements in a combination (a1,a2,,ak) must be in non-descending order. (i.e.,a1a2ak ).
  • The solution set must not contain duplicate combinations.
For example, given candidate set 10,1,2,7,6,1,5 and target 8, a solution set is: { [1, 7], [1, 2, 5] , [2, 6], [1, 1, 6] }
public ArrayList<ArrayList<Integer>> combinationSum2(int[] num, int target) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        if (num == null || num.length == 0)
            return result;
        Arrays.sort(num);       // Sort the candidate in non-descending order
        ArrayList<Integer> current = new ArrayList<Integer>();
        recursiveAppend(num, target, 0, current, result);
        return result;
    }
 
    private void recursiveAppend(int[] num, int target, int startIndex, ArrayList<Integer> current,
                                 ArrayList<ArrayList<Integer>> result) {
        if (target < 0)
            return;
        if (target == 0) {     // The current array is an solution
            result.add(new ArrayList<Integer>(current));
            return;
        }
        for (int i = startIndex; i < num.length; i++) {
            if (num[i] > target)    // No need to try the remaining candidates
                break;
            if (i > startIndex && num[i] == num[i-1])
                // The same number has been added earlier within the loop
                continue;
            // Add candidate[i] to the current array
            current.add(num[i]);
            // Recursively append the current array to compose a solution
            recursiveAppend(num, target-num[i], i+1, current, result);
            // Remove candidate[i] from the current array, and try next candidate in the next loop
            current.remove(current.size()-1);
        }
    }
Read full article from LeetCode - Combination Sum II | Darren's Blog

No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts