给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

输入: nums = [1,2,3]
输出:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

 

思路:

1.递归  每次决定是否要当前位置

public static List<List<Integer>> subsets(int[] nums) {
		List<List<Integer>> res = new ArrayList<>();
		ArrayList<Integer> list = new ArrayList<>();
		if (nums.length == 0 || nums == null) {
			return res;
		}
        getAll(nums,0,list,res);
		return res;

	}

	private static void getAll(int[] nums, int i, ArrayList<Integer> list, List<List<Integer>> res) {
		if (i==nums.length) {
			res.add(new ArrayList<>(list));
			return;
		}
		
		list.add(nums[i]);
		getAll(nums, i+1, list, res);   //要当前
		list.remove(list.size()-1);  
		getAll(nums, i+1, list, res);   //不要当前
		
	}

2.回溯递归   对每个位置

 public static List<List<Integer>> subsets(int[] nums) {
		List<List<Integer>> res = new ArrayList<>();
		ArrayList<Integer> list = new ArrayList<>();
		if (nums.length == 0 || nums == null) {
			return res;
		}
		//Arrays.sort(nums); // 排序
		dfs(nums, 0, list, res); // 递归调用
		res.add(new ArrayList<>());// 最后加进来空集
		return res;

	}

	// [1, 2, 3]
	private static void dfs(int[] nums, int start, List<Integer> list, List<List<Integer>> res) {
		for (int i = start; i < nums.length; i++) {
			list.add(nums[i]);
			// item是以整数为元素的动态数组,而res是以数组为元素的数组,
			// 在这一步,当item增加完元素后,item所有元素构成一个完整的子串,再由res纳入
			res.add(new ArrayList<>(list));
			dfs(nums, i + 1, list, res);
			list.remove(list.size() - 1);
		}
	}