题目:
Given a set of distinct integers, nums, return all possible subsets.
Note:
- Elements in a subset must be in non-descending order.
- The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,3]
, a solution is:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
题意:
给定一个由不同数字组成的数组nums,返回这个数组中的所有的子集。
注意:
1.子集中的元素必须是升序排列
2.最终的结果中不能包含重复的子集。
算法分析:
结合上一题《Combinations》的方法,将上一题作为子函数来使用。
AC代码:
<span style="font-family:Microsoft YaHei;font-size:12px;">public class Solution { public ArrayList<ArrayList<Integer>> subsets(int[] nums) { ArrayList<ArrayList<Integer>> fres = new ArrayList<ArrayList<Integer>>(); ArrayList<Integer> flist= new ArrayList<Integer>(); Arrays.sort(nums); fres.add(flist); for(int i=1;i<=nums.length;i++) { ArrayList<ArrayList<Integer>> sres = new ArrayList<ArrayList<Integer>>(); sres=combine(nums, i); fres.addAll(sres); } return fres; } public static ArrayList<ArrayList<Integer>> combine(int nums[], int k) { ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>(); if(nums.length<=0 || nums.length<k) return res; helper(nums,k,0,new ArrayList<Integer>(), res); return res; } private static void helper(int nums[], int k, int start, ArrayList<Integer> item, ArrayList<ArrayList<Integer>> res) { if(item.size()==k) { res.add(new ArrayList<Integer>(item)); return; } for(int i=start;i<nums.length;i++) // try each possibility number in current position { item.add(nums[i]); helper(nums,k,i+1,item,res); // after selecting number for current position, process next position item.remove(item.size()-1); // clear the current position to try next possible number } } }</span>
版权声明:本文为博主原创文章,转载注明出处
时间: 2024-10-25 08:48:11