遞歸+回溯
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
ArrayList<Integer> list = new ArrayList<>();
subsetHelper(result,list,nums,0);
return result;
}
private void subsetHelper(List<List<Integer>> result, ArrayList<Integer> list, int[] nums, int pos){
result.add(new ArrayList<Integer>(list));
for(int i = pos; i < nums.length; i++){
list.add(nums[i]);
subsetHelper(result,list,nums,i+1);
list.remove(list.size()-1);
}
}
}
位運算
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
for (int i = 0; i < 1 << nums.length; i++) {
List<Integer> path = new ArrayList<>();
for (int j = 0; j < nums.length; j++) {
if ((i >> j & 1) == 1) {
path.add(nums[j]);
}
}
ans.add(path);
}
return ans;
}
}
子集II
與前題相似,將nums[]
排序,把重複元素放在一起只取一個(去重)即可。
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
ArrayList<Integer> list = new ArrayList<>();
Arrays.sort(nums); //將重複元素放在一起
subsetHelper(result,list,nums,0);
return result;
}
private void subsetHelper(List<List<Integer>> result, ArrayList<Integer> list, int[] nums, int pos){
result.add(new ArrayList<Integer>(list));
for(int i = pos; i < nums.length; i++){
if(i != pos && nums[i] == nums[i-1]) //去重
continue;
list.add(nums[i]);
subsetHelper(result,list,nums,i+1);
list.remove(list.size()-1);
}
}
}
Permutations 全排列
套用模板
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
List<Integer> list = new ArrayList<Integer>();
permuteHelp(result,list,nums);
return result;
}
public void permuteHelp(List<List<Integer>> result,List<Integer> list,int[] nums){
if(list.size() == nums.length){
result.add(new ArrayList<Integer>(list));
return;
}
for(int i = 0; i < nums.length; i++){
if(list.contains(nums[i]))
continue;
list.add(nums[i]);
permuteHelp(result,list,nums);
list.remove(list.size()-1);
}
return;
}
}