动态规划-06subsets现在有一个没有重复元素的整数集合S,求S的所有子集java实现

题目描述(牛客需要排序输出)

现在有一个没有重复元素的整数集合S,求S的所有子集

注意:

  • 你给出的子集中的元素必须按非递增的顺序排列
  • 给出的解集中不能出现重复的元素

例如:

如果S=[1,2,3], 给出的解集应为:

[↵  [3],↵  [1],↵  [2],↵  [1,2,3],↵  [1,3],↵  [2,3],↵  [1,2],↵  []↵]

思路:用到回溯方法,具体思想可参考:回溯法

import java.util.ArrayList;
import java.util.Arrays;
public class Solution {
    ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>();
    public ArrayList<ArrayList<Integer>> subsets(int[] S) {
        res.add(new ArrayList<Integer>());
        if(S==null||S.length==0)
            return res;
        Arrays.sort(S);
        ArrayList<Integer> list=new ArrayList<Integer>();
        for(int i=1;i<=S.length;i++){
            backtracking(S,i,0,list);
        }
        return res;
    }
    public void backtracking(int[] S,int k,int start,ArrayList<Integer> list){
        if(k<0){
            return;
        }
        else if(k==0){
            res.add(new ArrayList<Integer>(list));
        }
        else{
            for(int j=start;j<S.length;j++){
                list.add(S[j]);
                backtracking(S,k-1,j+1,list);
                list.remove(list.size()-1);
            }
        }
    }
}

题目描述(LeetCode无需排序输出)

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

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

示例:

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

思路:对于题目中给的例子[1,2,3]来说,最开始是空集,那么我们现在要处理1,就在空集上加1,为[1],现在我们有两个自己[]和[1],下面我们来处理2,我们在之前的子集基础上,每个都加个2,可以分别得到[2],[1, 2],那么现在所有的子集合为[], [1], [2], [1, 2],同理处理3的情况可得[3], [1, 3], [2, 3], [1, 2, 3], 再加上之前的子集就是所有的子集合了。实现过程:

[]

[] [1]

[] [1] [2] [1,2]

[] [1] [2] [1,2] [3] [1,3] [2,3] [1,2,3]

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> res=new ArrayList<List<Integer>>();
        res.add(new ArrayList<Integer>());
        if(nums==null||nums.length==0){
            return res;
        }
        for(int i=0;i<nums.length;i++){
            int size=res.size();
            for(int j=0;j<size;j++){
                List<Integer> cur=new ArrayList<Integer>(res.get(j));
                cur.add(nums[i]);
                res.add(new ArrayList<Integer>(cur));
            }
        }
        return res;
    }
}
发布了32 篇原创文章 · 获赞 1 · 访问量 332

猜你喜欢

转载自blog.csdn.net/zy854816286/article/details/104979282