问题描述
给定一个含不同整数的集合,返回其所有的子集。
样例
样例1
输入:[0]
输出:
[
[],
[0]
]
样例2
输入:[1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
挑战
采用递归和非递归两种方式求解
代码
下列代码包括递归和非递归两种解法
import org.omg.PortableInterceptor.SUCCESSFUL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class SubSet {
/**
* @param nums: A set of numbers
* @return: A list of lists
*/
public List<List<Integer>> subsets(int[] nums) { //递归解法
// write your code here
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(nums);
List<Integer> ls = new ArrayList<>();
dfs(res, ls, 0, nums.length, nums);
return res;
}
private void dfs(List<List<Integer>> res, List<Integer> ls, int k, int m, int[] nums) {
if (k == m) {
res.add(new ArrayList<>(ls));
return;
}
ls.add(nums[k]); //要选
dfs(res, ls, k+1, m, nums);
ls.remove((Integer) nums[k]); //不选,把int型转变为Integer对象
dfs(res, ls, k+1, m, nums);
}
public List<List<Integer>> BFS(int[] nums) { //非递归解法
if (nums == null)
return new ArrayList<>();
List<List<Integer>> queen = new ArrayList<>();
int index = 0;
queen.add(new ArrayList<>());
while (index < queen.size()) {
List<Integer> subset = queen.get(index++);
for (int i = 0; i < nums.length; i++) {
if (subset.size() != 0 && subset.get(subset.size() -1) >= nums[i]) //顺序不可反
continue;
List<Integer> newSubset = new ArrayList<>(subset);
newSubset.add(nums[i]);
queen.add(newSubset);
}
}
return queen;
}
}