给定一个整数数组 nums ,其中可能包含重复元素,请你返回这个数组的所有可能子集。
返回的答案中不能包含重复的子集,将答案按字典序进行排序。
数据范围:数组长度满足 ,数组中元素大小满足
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型ArrayList<ArrayList<>> */ ArrayList<ArrayList<Integer>> result=new ArrayList<>(); LinkedList<Integer> path=new LinkedList<>(); public ArrayList<ArrayList<Integer>> subsets (int[] nums) { // write code here Arrays.sort(nums); backtracking(nums,0); return result; } void backtracking(int[] nums,int start){ result.add(new ArrayList<>(path)); for(int i=start;i<nums.length;i++){ if(i>start&&nums[i-1]==nums[i])continue; path.add(nums[i]); backtracking(nums,i+1); path.removeLast(); } } }
public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型ArrayList<ArrayList<>> */ private ArrayList<ArrayList<Integer>> result = new ArrayList<>(); private Deque<Integer> path = new LinkedList<>(); public ArrayList<ArrayList<Integer>> subsets (int[] nums) { Arrays.sort(nums); boolean[] used = new boolean[nums.length]; backTracking(nums, 0, used); Collections.sort(result, new CustomComparator()); return result; } private void backTracking(int[] nums, int index, boolean[] used) { result.add(new ArrayList<>(path)); for (int i=index; i<nums.length; i++) { if (i > 0 && used[i-1] == false && nums[i] == nums[i-1]) continue; used[i] = true; path.offer(nums[i]); backTracking(nums, i+1, used); path.pollLast(); used[i] = false; } } private static class CustomComparator implements Comparator<ArrayList<Integer>> { public int compare(ArrayList<Integer> a, ArrayList<Integer> b) { //if (a.isEmpty()) return 1; //if (b.isEmpty()) return -1; StringBuilder str1 = new StringBuilder(); StringBuilder str2 = new StringBuilder(); for (int e: a) str1.append(e); for (int e: b) str2.append(e); return str1.toString().compareTo(str2.toString()); } } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型二维数组 */ ArrayList<ArrayList<Integer>> ans = new ArrayList<ArrayList<Integer>>(); //HashSet<ArrayList<Integer>> set = new HashSet<ArrayList<Integer>>(); public ArrayList<ArrayList<Integer>> subsets (int[] nums) { // write code here ArrayList<Integer> list = new ArrayList<>(); //ans.add(list); Arrays.sort(nums); dfs(nums, 0, list); return ans; } public void dfs(int[] nums, int start, ArrayList<Integer> list){ if(!ans.contains(list)){ ans.add(new ArrayList<Integer>(list)); } for(int i=start;i<nums.length;i++){ list.add(nums[i]); dfs(nums, i+1, list); list.remove(list.size()-1); } } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型二维数组 */ ArrayList<ArrayList<Integer>> ans = new ArrayList<>(); List<Integer> list = new LinkedList<>(); public ArrayList<ArrayList<Integer>> subsets (int[] nums) { // write code here Arrays.sort(nums); dfs(nums,0); return ans; } void dfs(int[] nums, int index){ ans.add(new ArrayList(list)); for(int i =index; i < nums.length; i++){ if(i > index && nums[i] == nums [i-1]) { continue; } list.add(nums[i]); dfs(nums,i+1); list.remove(list.size() - 1); } } }