和全排列不一樣的點在於,全排列的時候每個點必須選,而此時,可以選,可以不選。
import java.util.*;
public class test {
public static void main(String[] args) {
int[] nums = {1,2,3};
List<List<Integer>> myres = subsets(nums);
System.out.println(myres);
}
public static List<List<Integer>> res = new LinkedList<>();
public static List<List<Integer>> subsets(int[] nums) {
backtracks(nums, 0, new LinkedList<>());
return res;
}
//遞歸遍歷數組,每到一個元素就有兩種情況:1.選該元素 2.不選該元素
public static void backtracks(int[] nums, int current, LinkedList<Integer> track) {
//已經遍歷完所有元素
if (current == nums.length) {
res.add(new LinkedList<>(track));
return;
}
//不選當前元素
backtracks(nums, current + 1, track);
//選當前元素
track.add(nums[current]);
backtracks(nums, current + 1, track);
//撤銷選取當前元素(回溯)
track.removeLast();
}
}