码迷,mamicode.com
首页 > 其他好文 > 详细

Subsets

时间:2015-11-28 11:56:23      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

Question: 

Given a set of distinct integers, return all possible subsets.

Example:

If S = [1,2,3], a solution is:

[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]
Note:
  • Elements in a subset must be in non-descending order.
  • The solution set must not contain duplicate subsets.

 

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)。

Subsets

标签:

原文地址:http://www.cnblogs.com/billzhou0223/p/5002286.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!