题目描述
Given a set of distinct integers, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
Example:
Input: nums = [1,2,3]
Output:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
AC代码1
简单粗暴的方法。
比如输入是1,2。
初始化一个List< List< Integer>> resList,然后往里面添加一个空元素(ArrayList)。resList 的初始状态: [ [ ] ]
遍历resList里面的元素,先把这个当前元素加入resList,然后在这个元素里面加入1。resList的状态是 [ [ ] [ 1] ]。
接着遍历resList里面的元素,先把这个当前元素加入resList,然后在这个元素里面加入2。resList是 [ [ ] [ 1] [2] [1,2]]。
说不不好理解的话看代码吧。
public class _78Subsets {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> resList = new ArrayList<>();
if(nums == null || nums.length == 0) return resList;
resList.add(new ArrayList<>());
for(int num : nums){
int len = resList.size();
for(int i = 0;i < len;i++){ //不可用语法糖遍历,也就是不可以用iterator,iterator便利的时候不可以执行add 和 delete等操作,只能用for循环取出每个元素的方式进行遍历
resList.add(new ArrayList<>(resList.get(i)));
resList.get(i).add(num);
}
}
return resList;
}
//测试
public static void main(String[] args) {
int[] nums = new int[]{1,2};
List<List<Integer>> resList = new _78Subsets().subsets(nums);
for(List lists : resList){
System.out.println(lists);
}
}
}
AC代码2
回溯法,迷宫之类的题目常用的方法,解法类似。
//回溯法
public List<List<Integer>> subsets_2(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++){ //以 i 打头的序列
tempList.add(nums[i]);
backtrack(list, tempList, nums, i + 1);
tempList.remove(tempList.size() - 1);
}
}