leetCode-78-Subsets
题目描述(中等难度)
给一个数组,输出这个数组的所有子数组。
解法一 迭代一
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
List<List<Integer>> ans = new ArrayList<List<Integer>>();
ans.add(new ArrayList<Integer>());
res.add(new ArrayList<Integer>());
int n = nums.length;
// 第一层循环,子数组长度从 1 到 n
for (int i = 1; i <= n; i++) {
// 第二层循环,遍历上次的所有结果
List<List<Integer>> tmp = new ArrayList<List<Integer>>();
for (List<Integer> list : res) {
// 第三次循环,对每个结果进行扩展
for (int m = 0; m < n; m++) {
//只添加比末尾数字大的数字,防止重复
if (list.size() > 0 && list.get(list.size() - 1) >= nums[m])
continue;
List<Integer> newList = new ArrayList<Integer>(list);
newList.add(nums[m]);
tmp.add(newList);
ans.add(newList);
}
}
res = tmp;
}
return ans;
}
解法二 迭代法2
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
ans.add(new ArrayList<>());//初始化空数组
for(int i = 0;i<nums.length;i++){
List<List<Integer>> ans_tmp = new ArrayList<>();
//遍历之前的所有结果
for(List<Integer> list : ans){
List<Integer> tmp = new ArrayList<>(list);
tmp.add(nums[i]); //加入新增数字
ans_tmp.add(tmp);
}
ans.addAll(ans_tmp);
}
return ans;
}
解法三 回溯法
看完两件小事
如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:
- 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
- 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
本文著作权归作者所有,如若转载,请注明出处
转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com