注意:
你给出的子集中的元素必须按升序排列
给出的解集中不能出现重复的元素
数据范围:
,集合中的任意元素满足
要求:空间复杂度
,时间复杂度
import java.util.*; // 回溯 public class Solution { private ArrayList<ArrayList<Integer>> res = new ArrayList<>(); // 结果集 private ArrayList<Integer> path = new ArrayList<>(); // 一次路径 public ArrayList<ArrayList<Integer>> subsets (int[] S) { // write code here if (S.length == 0) return res; Arrays.sort(S); // 排序 backtrack(S, 0); // 调用 res.sort((list1, list2)-> { // 结果集 排序 int m = list1.size(), n = list2.size(); if (m != n) return m - n; for (int i = 0; i < n; i++) { if (list1.get(i) == list2.get(i)) continue; return list1.get(i) - list2.get(i); } return 114514; // 不会到这 }); return res; } // 回溯 private void backtrack(int[] S, int k) { if (k == S.length) { res.add(new ArrayList<>(path)); return; } // 不选 backtrack(S, k + 1); // 选 path.add(S[k]); backtrack(S, k + 1); path.remove(path.size() - 1); } }
import java.util.*; public class Solution { public void backtrack(int[] nums, int start, ArrayList<Integer> subset, ArrayList<ArrayList<Integer>> result) { result.add(new ArrayList<>(subset)); for (int i = start; i < nums.length; i++) { subset.add(nums[i]); backtrack(nums, i + 1, subset, result); subset.remove(subset.size() - 1); } } public ArrayList<ArrayList<Integer>> subsets(int[] nums) { ArrayList<ArrayList<Integer>> result = new ArrayList<>(); backtrack(nums, 0, new ArrayList<>(), result); result.sort(Comparator.comparingInt((ArrayList<Integer> a) -> a.size()).thenComparingInt(a -> a.get(0))); return result; } }
ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>(); public ArrayList<ArrayList<Integer>> subsets (int[] S) { // write code here Arrays.sort(S); recur(S ,new ArrayList<Integer>() ,0); return res; } public void recur(int[] arr ,ArrayList<Integer> list ,int index){ res.add(new ArrayList<Integer>(list)); for(int i=index;i<arr.length;i++){ list.add(arr[i]); recur(arr ,list ,i+1); list.remove(list.size()-1); } }
import java.util.*; public class Solution { public ArrayList<ArrayList<Integer>> subsets(int[] S) { int n = S.length; ArrayList<ArrayList<Integer>>ans = new ArrayList<>(); ans.add(new ArrayList<Integer>()); for (int i = 0; i < n; i++) { int size = ans.size(); for (int j = 0; j < size; j++) { ArrayList<Integer>path = new ArrayList<Integer>(); path.addAll(ans.get(j)); path.add(S[i]); ans.add(path); } } int size=ans.size(); for (int i = 0; i <size - 1; i++) // Last i elements are already in place for (int j = 0; j < size - i - 1; j++) if (ans.get(j).size() > ans.get(j+1).size()){ ArrayList<Integer>tmp=new ArrayList<>(); tmp=ans.get(j); ans.set(j,ans.get(j+1)); ans.set(j+1,tmp); } return ans; } }
import java.util.*; //位运算求全子集 public class Solution { public ArrayList<ArrayList<Integer>> subsets(int[] S) { ArrayList<ArrayList<Integer>> ans = new ArrayList<ArrayList<Integer>>(); if(S==null||S.length==0) return ans; //由于要子集当中的元素升序,所以可以先对S排序,最后子集当中求出的子集内部就是有序的。 Arrays.sort(S); int len = S.length; int num = (int)Math.pow(2,len); for(int i = 0;i<num;i++){ ArrayList<Integer> ls = new ArrayList<Integer>(); int count = 0; int flag = i; while(flag!=0){ int index = flag&1; if(index==1) ls.add(S[count]); flag = flag>>1; count++; } ans.add(ls); } return ans; } }
import java.util.*; public class Solution { public ArrayList<ArrayList<Integer>> subsets(int[] S) { ArrayList<ArrayList<Integer>> res = new ArrayList<>(); if(S == null) return res; backtrack(res, S, 0, new ArrayList<>()); return res; } public void backtrack(ArrayList<ArrayList<Integer>> res, int[] S, int index, ArrayList<Integer> list){ res.add(new ArrayList<>(list)); for(int i = index; i < S.length; i++){ list.add(S[i]); backtrack(res, S, i + 1, list); list.remove(list.size() - 1); } } }
import java.util.*; public class Solution { ArrayList<ArrayList<Integer>> res=new ArrayList<>(); public ArrayList<ArrayList<Integer>> subsets(int[] S) { Arrays.sort(S); int n=S.length; dfs(S,0,new ArrayList<Integer>()); return res; } public void dfs(int[]s,int index,ArrayList<Integer> temp){ res.add(new ArrayList<Integer>(temp)); for(int i=index;i<s.length;i++){ temp.add(s[i]); dfs(s,i+1,temp); temp.remove(temp.size()-1); } } }
import java.util.*; public class Solution { ArrayList<ArrayList<Integer>> ans = new ArrayList<>(); List<Integer> list = new LinkedList<>(); public ArrayList<ArrayList<Integer>> subsets(int[] S) { dfs(S,0); return ans; } void dfs(int[] nums, int index){ ans.add(new ArrayList(list)); for(int i = index; i< nums.length; i++){ list.add(nums[i]); dfs(nums,i+1); list.remove(list.size() - 1); } } }
import java.util.*; public class Solution { public ArrayList<ArrayList<Integer>> subsets(int[] S) { ArrayList<ArrayList<Integer>> res=new ArrayList<>(); if(S==null || S.length==0) return res; Arrays.sort(S); dfs(S,0,new ArrayList<Integer>(),res); return res; } private void dfs(int[] nums, int startIndex, ArrayList<Integer> subset, ArrayList<ArrayList<Integer>> res){ res.add(new ArrayList<Integer>(subset));//深复制 // res.add(subset); for(int i=startIndex;i<nums.length;i++){ subset.add(nums[i]); // ArrayList<Integer> newSet = new ArrayList<Integer>(subset); // newSet.add(nums[i]); // dfs(nums,i+1,newSet,res); dfs(nums,i+1,subset,res); subset.remove(subset.size()-1); } } }
ArrayList<ArrayList<Integer>> res; ArrayList<Integer> temp; public ArrayList<ArrayList<Integer>> subsets(int[] S) { res = new ArrayList<>(); int n=S.length; if(S==null || n==0){ res.add(new ArrayList<>()); return res; } temp = new ArrayList<>(); dfs(S,0); res.sort(new Comparator<ArrayList<Integer>>(){ @Override public int compare(ArrayList<Integer> l1,ArrayList<Integer> l2){ int num1 = l1.size()-l2.size(); if(num1==0){ int num2=0; for(int i=0;i<l1.size();i++){ if(l1.get(i)!=l2.get(i)){ num2 = l1.get(i)-l2.get(i); } } return num2; } else{ return num1; } } }); return res; } public void dfs(int[] S,int index){ if(index>S.length) return; if(index==S.length) {res.add(new ArrayList<>(temp));return;} temp.add(S[index]); dfs(S,index+1); temp.remove(temp.size()-1); dfs(S,index+1); }
import java.util.*; // 使用BFS实现所有子集有序 public class Solution { public ArrayList<ArrayList<Integer>> subsets(int[] S) { ArrayList<ArrayList<Integer>> ansLists = new ArrayList<>(); ansLists.add(new ArrayList<>()); if(S==null || S.length==0) return ansLists; Queue<List<Integer>> queue = new LinkedList<>(); for(int i=0; i<S.length; i++) { ArrayList<Integer> tmp = new ArrayList<>(); tmp.add(i); queue.add(tmp); } while(!queue.isEmpty()) { int size = queue.size(); for(int i=0; i<size; i++) { List<Integer> head = queue.poll(); ansLists.add(new ArrayList<>(head)); for(int j=head.get(head.size()-1)+1; j<S.length; j++) { head.add(j); queue.add(new ArrayList<>(head)); head.remove(head.size()-1); } } } for(List<Integer> list: ansLists) { for(int i=0; i<list.size(); i++) { list.set(i, S[list.get(i)]); } } return ansLists; } }
public ArrayList<ArrayList<Integer>> subsets(int[] S) { ArrayList<ArrayList<Integer>> lll = new ArrayList<>(); ArrayList<Integer> list = new ArrayList<>(); lll.add(list); huiSu(S,list,0, lll); return lll; } public void huiSu(int[] S, ArrayList<Integer> ll, int i, ArrayList<ArrayList<Integer>> lll){ for(; i < S.length; i++){ ArrayList<Integer> list = new ArrayList<>(ll); list.add(S[i]); lll.add(list); huiSu(S, list, i+1, lll); } }2. 位运算
public ArrayList<ArrayList<Integer>> subsets(int[] S) { ArrayList<ArrayList<Integer>> lll = new ArrayList<>(); int end = 1 << S.length; for (int i = 0; i < end; i++){ ArrayList<Integer> list = new ArrayList<>(); for(int j = 0; j< S.length; j++){ if((1<<j & i) !=0){ list.add(S[j]); } } lll.add(list); } return lll; }
import java.util.*; public class Solution { ArrayList<ArrayList<Integer>> res = new ArrayList<>(); ArrayList<Integer> ls = new ArrayList(); public ArrayList<ArrayList<Integer>> subsets(int[] S) { //保证了不会重复访问 int[] used = new int[S.length]; Arrays.sort(S); dfs(S,used,0); return res; } private void dfs(int[] a,int[] used,int start) { //这一步没有return; 保证了将每个遍历到的都输出一遍 res.add(new ArrayList(ls)); for(int i = start; i < a.length; i++) { if(used[i] == 1) continue; ls.add(a[i]); used[i] = 1; dfs(a,used,i); ls.remove(ls.size()-1); used[i] = 0; } } }
import java.util.*; public class Solution { ArrayList<ArrayList<Integer>> res = new ArrayList<>(); ArrayList<Integer> ls = new ArrayList(); public ArrayList<ArrayList<Integer>> subsets(int[] S) { int[] used = new int[S.length]; Arrays.sort(S); dfs(S,used,0); return res; } private void dfs(int[] a,int[] used,int start) { res.add(new ArrayList(ls)); for(int i = start; i < a.length; i++) { if(used[i] == 1) continue; ls.add(a[i]); used[i] = 1; dfs(a,used,i); ls.remove(ls.size()-1); used[i] = 0; } } }
import java.util.*; public class Solution { ArrayList<Integer> subResult = new ArrayList(); public ArrayList<ArrayList<Integer>> subsets(int[] S) { // 升序排列 Arrays.sort(S); ArrayList<ArrayList<Integer>> result = new ArrayList(); ArrayList<Integer> subResult = new ArrayList(); // 一个都不选择 result.add(subResult); for(int i = 0 ; i< S.length; i++){ // 选择S[i]时,才会增加状态 原先的SubResult 每个增加一个S[i]; ArrayList<ArrayList<Integer>> newResult = new ArrayList(); for(ArrayList<Integer> lastSubResult : result){ ArrayList<Integer> newSubResult = new ArrayList(); newSubResult.addAll(lastSubResult); newSubResult.add(S[i]); newResult.add(newSubResult); } result.addAll(newResult); } return result; } }
import java.util.*; public class Solution { ArrayList<ArrayList<Integer>> arrays = new ArrayList<ArrayList<Integer>>(); public ArrayList<ArrayList<Integer>> subsets(int[] S) { ArrayList<Integer> array = new ArrayList<Integer>(); if (S.length == 0){ arrays.add(array); } Arrays.sort(S); function(S,0,S.length - 1,array); return arrays; } public void function(int[] arr,int start,int end,ArrayList<Integer> array){ if (!arrays.contains(new ArrayList<Integer>(array))){ arrays.add(new ArrayList<Integer>(array)); } if (start > end){ return ; } array.add(arr[start]); function(arr,start + 1,end,array); array.remove(array.size() -1); function(arr,start + 1,end,array); } }
利用位运算的性质,组合数共2^n个,用迭代,某位为1就代表取这个值,为0代表不取public ArrayList<ArrayList<Integer>> subsets(int[] S) { int size = 1 << S.length; ArrayList<ArrayList<Integer>> res = new ArrayList<>(size); for (int i = 0; i < size; i++) { res.add(process(i, S)); } return res; } private ArrayList<Integer> process(int index, int[] S){ ArrayList<Integer> list = new ArrayList<>(); for (int i = 0; i < S.length; i++) { int bit = index >>> i; if((bit & 1) == 1) { list.add(S[i]); } } return list; }