Skip to main content

[LeetCode Solution 39]: Combination Sum


[LeetCode Solution 39]:  Combination Sum

*********************************************************************************

Question:

Given a set of candidate numbers (C(without duplicates) and a target number (T), find all unique combinations in C where the candidate numbers sum to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
  • All numbers (including the target) will be positive integers.
  • The solution set must not contain duplicate combinations.
For example, given candidate set [2, 3, 6, 7] and target,7
A solution set is: 
[
  [7],
  [2, 2, 3]
]

--------------------------------------------------------------------------------------------------

Approach Recursive Method

Intuition
Most problems like this, which requires the return of all the required solutions, can be solved by recursive and the thinking part is similar.
if you carefully study these topics are found in a routine, are required to write another recursive function, I always named this function as 'helper'.
In this problem, we explain use problem example, where candidate set [2, 3, 6, 7] and target 7, and try to find the solution:
[
  [7],
  [2, 2, 3]
]
We can consider this problem as the problem to find a tree path where the sum of tree node value on this path
is equal to target.
Screen Shot 2017-09-16 at 6.11.36 PM.png
As shown in the picture which starts from value 2, and we find a path in the tree which is [2, 2, 3]. How can we find the path like that?
Depth First Search !!!.
Generally, we use the stack to implement DFS, so the following code is like this:
Java
class Solution {
 public List<List<Integer>> combinationSum(int[] candidates, int target) {
  List<List<Integer>> res = new ArrayList<>();
  helper(candidates, target, 0, res, new ArrayList<>());
  return res;
 }
 
 public void helper(int[] candidates, int tar, int start, List<List<Integer>> res, List<Integer> temp)
 {
  if(tar < 0) return;
  else if(tar == 0) res.add(new ArrayList<>(temp));
  else
  {
   for(int i = start; i<candidates.length;i++)
   {
    temp.add(candidates[i]);
    helper(candidates, tar-candidates[i], i, res, temp);
    temp.remove(temp.size()-1);
   }
  }
 }
}
Complexity Analysis
  • Time complexity : \(O(n)\). where \(n\) is the number of elements in an array. Because we have to visit all the tree node to get the path.
  • Space complexity : \(O(log(n))\). The space complexity is related to the height of the 'Tree' which is \(O(log(n))\)

Can we do better?

Strategy
Every time we visit a node and we have to update the target value and then continue the recursive using the updated value.
But this case is not always necessary. Because when the node value which we visited is bigger than the target value
and we still doing the recursive is wasting time.
The modified code is as follows:
Java
class Solution {
 public List<List<Integer>> combinationSum(int[] candidates, int target) {
  List<List<Integer>> res = new ArrayList<>();
  Arrays.sort(candidates);
  helper(candidates, target, 0, res, new ArrayList<>());
  return res;
 }
 
 public void helper(int[] candidates, int tar, int start, List<List<Integer>> res, List<Integer> temp)
 {
  if(tar < 0) return;
  else if(tar == 0) res.add(new ArrayList<>(temp));
  else
  {
   for(int i = start; i<candidates.length;i++)
   {
    if(candidates[i]>tar) break;
    temp.add(candidates[i]);
    helper(candidates, tar-candidates[i], i, res, temp);
    temp.remove(temp.size()-1);
   }
  }
 }
}
Complexity Analysis
  • Time complexity : \(O(n)\). where \(n\) is the number of elements in the array. Because we have to visit all the tree node to get the path.
  • Space complexity : \(O(log(n))\). The space complexity is related to the height of the 'Tree' which is \(O(log(n))\)

The Running results:

Comments

Popular posts from this blog

[LeetCode Solution 230]: Kth Smallest Element in a BST

Question: Given a binary search tree, write a function  kthSmallest  to find the  k th smallest element in it. ************************************************************************************************************************************ Write Infront To read to a tutorial, please to read the tutorial of in-order traversal of BST, please check: LeetCode Solution 94: Binary Tree Inorder Traversal We are going to solve this question using the following 4 methods: ->Binary Search ->Recursive ->Iterative ->Morris  Approach #1 Binary Search [Accepted] Detail Explanation The first method to solve this problem is using Binary Search. The idea is very easy and extremely to think. We use BST's property that the left child of the root is smaller than the root while the right child of the root is always bigger. We consider that the root is the pivot, and find the number of the nodes in the left subtree and the number of the nodes in th

[LeetCode Solution 145] Binary Tree Postorder Traversal

[LeetCode Solution 145]: Binary Tree Postorder Traversal Question: Given a binary tree, return the  postorder  traversal of its nodes' values. For example: Given binary tree  {1,#,2,3} , 1 \ 2 / 3 return  [3,2,1] . Approach #1 Recursive [Accepted] Detail Explanation The first method to solve this problem is using recursive. This is the classical method and straightforward. we can define a helper function to implement recursion. The java code is as follows: Java public class Solution { public List<Integer> postorderTraversal (TreeNode root) { List<Integer> res = new ArrayList<>(); helper(root, res); return res; } public void helper (TreeNode root, List<Integer> res) { if (root != null ) { if (root.left != null ) { helper(root.left, res); } if (root.right != null ) { helper(root.right, res); } res.add(root.val); } } } Complexity Analysis Time complexity :

[Interview]: URLify

[Interview]  URLify: -------------------------------------------------------------------------------------------------------------------------- Question: URLify: Write a method to replace all spaces in a string with ‘%20’, you may assume that the string has sufficient space at the end to hold the additional characters. Example  input: ' mr john smith '  output: ' mr %20john%20smith' --------------------------------------------------------------------------------------------------------------------------   Idea 1:  Start from the back and start replacing until the character is not ' ', and replace the characters in reverse order. Solution 1: public class Solution{ public String replace(char[] str) { boolean flag = false; StringBuffer sb = new StringBuffer(); for (int i = str.length - 1; i >= 0; i--) { if (str[i] != ' ') flag = true; if (flag == true) { if (str[i] == ' ') { s