前言
-🏀大家好,我是BXuan,热爱编程与篮球的软件工程大二学生一名
-📚当爱上Coding&&Studying的那一刻…
-🏃放弃不难,但坚持一定很酷。
78.子集
难度:中等
🔊题目描述:
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能包含重复的子集。你可以按任意顺序返回解集。
🎱输入输出示例:
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
👓提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums 中的所有元素 互不相同
🙋♀️代码示例:
class Solution {
// 定义存放结果集
List<List<Integer>> res = new LinkedList<>();
// 定义路径集合
List<Integer> track = new LinkedList<>();
// 主函数
public List<List<Integer>> subsets(int[] nums) {
// 进入回溯函数
backtrack(nums,0);
// 返回
return res;
}
// 在对函数进行定义的时候,因为该回溯函数返回的是所有的子集
// 所以应该对该数组进行二叉树的管理,然后对层数进行调用,与46.全排列题目不同。
private void backtrack(int[] nums, int start){
// 直接对结果进行存储
res.add(new LinkedList<>(track));
for(int i = start;i < nums.length;i++){
// 做选择
track.add(nums[i]);
// 进入回溯函数
backtrack(nums,i+1);
// 撤销选择
track.remove(track.size()-1);
}
}
}
👏小结
回溯算法其实就是暴力穷举的一个过程,转化成二叉树的示意图然后结合是否裁枝以及穷举的一个条件进行遍历。
回溯算法模板:
List<Integer> res;
void backtrack(路径,选择列表){
if(满足结束条件){
res.add(路径);
return;
}
for(选择:选择列表){
做选择;
backtrack(路径,选择列表);
撤销选择;
}
}