2022-1-21DFSday3
题1:
给你一个整数数组 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 class Solution { 2 List<List<Integer>> ans; 3 public List<List<Integer>> subsets(int[] nums) { 4 ans = new ArrayList<>(); 5 int n=nums.length; 6 List<Integer> list=new ArrayList<>(); 7 //遍历数组 8 dfs(0,n,nums,list); 9 return ans; 10 } 11 12 13 public void dfs(int index,int n,int[] nums,List<Integer> list){ 14 //如果到n索引直接加入解答 15 if (index==n) { 16 ans.add(new ArrayList<>(list)); 17 return; 18 } 19 //第一种情况,index索引的数字不要 20 dfs(index+1,n,nums,list); 21 //第二种情况,index索引需要,加入列表 22 list.add(nums[index]); 23 dfs(index+1,n,nums,list); 24 list.remove(list.size()-1); 25 } 26 }
思路:遍历数组,每个数字要么加入集合,要么不加入集合。
题2:全排列,见2022-1-19博客
题3:
给定两个整数 n
和 k
,返回范围 [1, n]
中所有可能的 k
个数的组合。
你可以按 任何顺序 返回答案。
示例 1:
输入:n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
示例 2:
输入:n = 1, k = 1 输出:[[1]]
提示:
1 <= n <= 20
1 <= k <= n
1 class Solution { 2 List<List<Integer>> ans; 3 public List<List<Integer>> combine(int n, int k) { 4 ans=new ArrayList<>(); 5 List<Integer> list=new ArrayList<>(); 6 dfs(0,1,k,n,list); 7 return ans; 8 } 9 10 public void dfs(int count,int index,int k,int end,List<Integer> list){ 11 if (count==k) { 12 ans.add(new ArrayList<>(list)); 13 return; 14 } 15 if (index>end) return; 16 17 //要 18 list.add(index); 19 dfs(count+1,index+1,k,end,list); 20 list.remove(list.size()-1); 21 22 //不要 23 dfs(count,index+1,k,end,list); 24 } 25 }
思路:跟子集类似,对于每一个数字都有选择或者不选择两个选项,区别在于需要一个变量记录选择了多少个数字,当选够k个数字后,记录答案并返回。
优化:
1 //剪枝,剩余的数字不够k个直接返回 2 if (end-index+1+count<k) return;