标签:
Question:
Given a set of distinct integers, return all possible subsets.
If S = [1,2,3]
, a solution is:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
Analysis:
1.
这个问题要求所有的可能情况,所以可以考虑用搜索的方法。这里使用DFS求解。从空集开始(需要注意空集是任何集合的子集),每次往集合中加入一个元素,直到没有元素可以添加。因为题目要求子集中的元素是升序排列,所以可以先对数组进行排序,然后添加元素的时候只要往后搜索就行了。
[]
/ | \
[1] [2] [3]
/ | |
[1,2] [1,3] [2,3]
|
[1,2,3]
2. 也可以用非递归的方式求解。核心思想就是每访问一个元素,将该元素加入到当前result中的每一个集合中,构造一个新的集合然后存回到result。
Code:
1. Recursion:
1 class Solution { 2 /** 3 * @param nums: A set of numbers. 4 * @return: A list of lists. All valid subsets. 5 */ 6 public ArrayList<ArrayList<Integer>> subsets(int[] nums) { 7 if(nums == null) return null; 8 9 ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); 10 ArrayList<Integer> list = new ArrayList<Integer>(); 11 Arrays.sort(nums); 12 subsetsHelper(result, list, nums, 0); 13 14 return result; 15 } 16 17 public void subsetsHelper(ArrayList<ArrayList<Integer>> result, 18 ArrayList<Integer> list, 19 int[] nums, 20 int p) { 21 result.add(new ArrayList<Integer>(list)); 22 23 for(int i = p; i < nums.length; ++i) { 24 list.add(nums[i]); 25 subsetsHelper(result, list, nums, i + 1); 26 list.remove(list.size() - 1); 27 } 28 } 29 }
2. Non-recursion:
1 class Solution { 2 /** 3 * @param nums: A set of numbers. 4 * @return: A list of lists. All valid subsets. 5 */ 6 7 //non-recursion 8 public ArrayList<ArrayList<Integer>> subsets(int[] nums) { 9 if(nums == null) return null; 10 11 ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); 12 ArrayList<Integer> list = new ArrayList<Integer>(); 13 Arrays.sort(nums); 14 result.add(list); 15 16 for(int i = 0; i < nums.length; ++i) { 17 int len = result.size(); 18 for(int j = 0; j < len; ++j) { 19 ArrayList<Integer> temp = new ArrayList<Integer>(result.get(j)); 20 temp.add(nums[i]); 21 result.add(temp); 22 } 23 } 24 return result; 25 } 26 }
Complexity:
每个元素有 取/不取 两种情况,所以所有的可能情况是2^n, 时间复杂度为O(2^n)。其中用了list来储存中间变量,长度最长为n,所以空间复杂度为O(n)。
标签:
原文地址:http://www.cnblogs.com/billzhou0223/p/5002286.html