本文主要是介绍78. Subsets 90. Subsets II,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Given a set of distinct integers, nums, return all possible subsets.
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,3]
, a solution is:
[[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[] ]
排列集合: 无重复数字
List<List<Integer>> 是引用类型所以在 backtrack中要使用list.add(new ArrayList<>(temList) ) 不能直接使用list.add(temList) temList只在 backtrack中不是全局变量返回时变成空
public class Solution {public List<List<Integer>> subsets(int[] nums) {List<List<Integer>> list = new ArrayList<>();Arrays.sort(nums);backtrack(list, new ArrayList<>(), nums, 0);return list;
}private void backtrack(List<List<Integer>> list , List<Integer> tempList, int [] nums, int start){list.add(new ArrayList<>(tempList));for(int i = start; i < nums.length; i++){tempList.add(nums[i]);backtrack(list, tempList, nums, i + 1);tempList.remove(tempList.size() - 1);}
}
}
有重复数字的排列:
public class Solution {public List<List<Integer>> subsetsWithDup(int[] nums) {List<List<Integer>> list =new ArrayList<List<Integer>>();if(nums.length==0) return list;Arrays.sort(nums);backtrack(list,new ArrayList<>(),nums,0);return list;}public List<Integer> backtrack(List<List<Integer>> list,List<Integer> listtem,int [] nums,int start){list.add(new ArrayList<>(listtem));for(int i=start;i<nums.length;i++){if(i>start&&nums[i-1]==nums[i]) continue; //判断重复数字出现的位置,如果是在每次循环的第一个位置出现则加 否则就要删除,因为会和前一个重复listtem.add(nums[i]);backtrack(list,listtem,nums,i+1);listtem.remove(listtem.size()-1);}return listtem;}
}
这篇关于78. Subsets 90. Subsets II的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!