leetcode 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 中的所有元素 互不相同
思路:
是这个过程,假设输入数组是{1,2,3}
我想要,1,12,123,13,2,23,3。我是这样思考的。也就是我每次进来数组的一个数都是累加,如果加到最后一个数,那么我就换上一个数。就像我加到123时,已经时最后一个数了,所以我把组合12,给换成了13,让3取代2的位置。
代码实现:
class Solution {
// 这个链表用来存现在有几个数在排序
List<Integer> t = new ArrayList<Integer>();
// 结果链表
List<List<Integer>> ans = new ArrayList<List<Integer>>();
public List<List<Integer>> subsets(int[] nums) {
// 调用方法,递归开始(入口)
dfs(0, nums);
return ans;
}
// 递归的方法
public void dfs(int cur, int[] nums) {
// 如果下标越界了,说明是遍历到最后一个,就保存
if (cur == nums.length) {
ans.add(new ArrayList<Integer>(t));
return;
}
// 如果不是最后一个就加入排序列表
t.add(nums[cur]);
// 递归下一个元素
dfs(cur + 1, nums);
// 移除这一个
t.remove(t.size() - 1);
// 换下一个人上
dfs(cur + 1, nums);
}
}