LeetCodd——子集(java)——回溯算法

子集

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

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

示例:

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


思路:这依然是一道排列组合的题目,定义一个标记数组,表示每个元素取不取,具体看代码:

package 中级回溯;

import java.util.ArrayList;
import java.util.List;

public class 子集 {
	
    public List<List<Integer>> subsets(int[] nums) {
    	
    	List<List<Integer>> list = new ArrayList<>();
    	
    	List<Integer> single = new ArrayList<>();
    	
    	//标记数组
    	boolean[] a = new boolean[nums.length];
    	digui(list,single,nums,a,0);
    	return list;
    }
    public static void digui(List<List<Integer>> list,List<Integer> single,int[] nums,boolean[] a,int n) {
    	if (n == nums.length) {
    		//吧标记了取的元素放进single队列里
    		for (int i = 0; i < a.length; i++) {
				if (a[i]) {
					single.add(nums[i]);
				}
			}
    		//注意一定要new一个,不然只是复制一个引用
			list.add(new ArrayList<Integer>(single));
			//清空队列
			single.removeAll(single);
			return;
		}
    	else {
    		//取n的情况,准备看下一个
			a[n] = false;
			digui(list, single, nums, a, n+1);
			//不取n的情况,看下一个
			a[n] =true;
			digui(list, single, nums, a, n+1);
		}
    }
}

猜你喜欢

转载自blog.csdn.net/likunkun__/article/details/80382368