lintcode 17.子集

给定一个含不同整数的集合,返回其所有的子集

子集中的元素排列必须是非降序的,解集必须不包含重复的子集

eg:S=[2,3,1];

那么所有排列就是[[],[1],[2],[3],[1,3],[1,2],[2,3],[1,2,3]]

思路:空集单独打印,其余每个排列的长度是1,2,···,n,根据长度来进行寻找并保存。由于要求非降序,首先对原数组进行排序。

class Solution{

        public ArrayList<ArrayList<Integer>> subsets(int[] nums){

            ArrayList<ArrayList<Integer>> ans= new ArrayList<>();

            ans.add(new ArrayLIst<Integer>());

            if(numbers==null||numbers.length==0)

            return ans;//空集也是子集

            Arrays.sort(nums);

            for(int i=1;i<=nums.length;i++){

                    //依次找出,元素个数为1,为2...,为nums总长度的排列

                    helper(ans,new ArrayList<Integer>(),nums,0,i);

            }

            return ans;

    }

        //k用来指定此次排列还需要的元素个数

       public void helper(ArrayList<ArrayList<Integer>> resSet, ArrayList<Integer> list, int[] nums, int start, int k)

        {

            //达到指定的长度,将此时的排列存入结果

            if(k==0){

                resSet.add(new ArrayList<Integer>(list));

                return;

            }

            for(int i=start;i<nums.length;i++){

                    list.add(nums[i]);

                    helper(resSet, list, nums, i+1, k-1);

                    list.remove(list.size()-1);

            }

       }

}

猜你喜欢

转载自blog.csdn.net/thyzy120605/article/details/80663812