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;

posted on 2022-01-21 16:45  阿ming  阅读(19)  评论(0编辑  收藏  举报

导航