题目:
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
例如:
输入:nums = [1,2,3]
输出:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
思路:采用回溯算法;回溯算法的思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。用回溯算法解决问题的一般步骤为: 1、定义一个解空间,它包含问题的解。 2、利用适于搜索的方法组织解空间。 3、利用深度优先法搜索解空间。 4、利用限界函数避免移动到不可能产生解的子空间。 问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性。回溯算法一般要用到递归的特性:先进后出。
代码如下:
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> list=new ArrayList<>();
backtrack(list,new ArrayList<Integer>(),nums,0);
return list;
}
public void backtrack(List<List<Integer>> list,ArrayList<Integer> sublist,int[] nums,int start){
//添加一个空集
list.add(new ArrayList<Integer>(sublist));
for(int i=0;i<nums.length;i++){
sublist.add(nums[i]);
backtrack(list,sublist,nums,i+1);
sublist.remove(sublist.size()-1);
}
}
}
时间复杂度:O(2^n);
空间复杂度:O(2^n);