题目描述
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
思路
1.这道题可以使用回溯思想求解。
2.解题思路与77.组合类似,我们只需要进行0到n次组合计算即可。
Java代码实现
public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> res = new ArrayList<>(); for (int i=0;i<=nums.length;i++){ combine(res,nums,i); } return res; } private void combine(List<List<Integer>> res ,int[] nums, int k){ combine(res,new ArrayList(),0,nums,k); } private void combine(List<List<Integer>> res,List<Integer> cur,int start,int[] nums,int k){ if(cur.size() == k){ res.add(new ArrayList<>(cur)); return; } for (int i = start; i <nums.length ; i++) { cur.add(nums[i]); combine(res,cur,i+1,nums,k); cur.remove(cur.size()-1); } }
Golang代码实现
func subsets(nums []int) [][]int { res := make([][]int,0) for i:=0;i<=len(nums);i++{ combine(nums,i,&res) } return res } func combine(nums []int,n int,res *[][]int){ combineBackTrace(nums,0,n,[]int{},res) } func combineBackTrace(nums []int,cur int,n int,curNums []int,res *[][]int){ if n == len(curNums){ copyNum := make([]int,len(curNums)) copy(copyNum,curNums) *res = append(*res,copyNum) return } for i:=cur;i<len(nums);i++{ curNums = append(curNums,nums[i]) combineBackTrace(nums,i+1,n,curNums,res) curNums = curNums[0:len(curNums)-1] } }