当前位置:   article > 正文

LeetCode078之子集(相关话题:组合排列)

leetcode078

题目描述

给你一个整数数组 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 中的所有元素 互不相同

解题思路

方法一

 方法二

假设我们需要找到一个长度为 n 的序列 a 的所有子序列,代码框架是这样的:

  1. List<Integer> t = new ArrayList<Integer>();
  2. void dfs(int cur, int n) {
  3. if (cur == n) {
  4. // 记录答案
  5. // ...
  6. return;
  7. }
  8. // 考虑选择当前位置
  9. t.add(cur);
  10. dfs(cur + 1, n, k);
  11. t.reomve(t.zise()-1);
  12. // 考虑不选择当前位置
  13. dfs(cur + 1, n, k);
  14. }

代码实现

方法一

  1. class Solution {
  2. List<Integer> t = new ArrayList<Integer>();
  3. List<List<Integer>> ans = new ArrayList<List<Integer>>();
  4. public List<List<Integer>> subsets(int[] nums) {
  5. int n = nums.length;
  6. //先遍历n位二进制,所有可能的组合
  7. for (int mask = 0; mask < (1 << n); ++mask) {
  8. t.clear();
  9. //再遍历nums数组,判断i对应二进制数位是否在mask的二进制数据位上存在
  10. for (int i = 0; i < n; ++i) {
  11. //1 << i可理解为i对应二进制上填1其余位填0
  12. if ((mask & (1 << i)) != 0) {
  13. t.add(nums[i]);
  14. }
  15. }
  16. ans.add(new ArrayList<Integer>(t));
  17. }
  18. return ans;
  19. }
  20. }

方法二

  1. class Solution {
  2. List<Integer> t = new ArrayList<Integer>();
  3. List<List<Integer>> ans = new ArrayList<List<Integer>>();
  4. public List<List<Integer>> subsets(int[] nums) {
  5. dfs(0, nums);
  6. return ans;
  7. }
  8. public void dfs(int cur, int[] nums) {
  9. if (cur == nums.length) {
  10. ans.add(new ArrayList<Integer>(t));
  11. return;
  12. }
  13. t.add(nums[cur]);
  14. dfs(cur + 1, nums);
  15. t.remove(t.size() - 1);
  16. dfs(cur + 1, nums);
  17. }
  18. }

拓展应用

LeetCode 39. 组合总和

  1. class Solution {
  2. List<Integer> t = new ArrayList<Integer>();
  3. List<List<Integer>> ans = new ArrayList<List<Integer>>();
  4. public List<List<Integer>> combinationSum(int[] candidates, int target) {
  5. Arrays.sort(candidates);
  6. dfs(candidates,target,0);
  7. return ans;
  8. }
  9. //我们定义递归函数 dfs(target, combine, idx) 表示当前在 candidates 数组的第 idx 位,还剩 target 要组合
  10. public void dfs(int[] candidates,int target,int index) {
  11. if(index == candidates.length){
  12. return;
  13. }
  14. if (target == 0) {
  15. ans.add(new ArrayList<Integer>(t));
  16. return;
  17. }
  18. if(candidates[index]<=target){
  19. t.add(candidates[index]);
  20. dfs(candidates,target-candidates[index],index);
  21. t.remove(t.size() - 1);
  22. dfs(candidates,target,index+1);
  23. }else{
  24. return;
  25. }
  26. }
  27. }

 知识复习

1&1=1

1&0=0

0&0=0

 博主总结

应用拓展一定要自己写一遍才知道自己的思考盲点在哪

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/935524
推荐阅读
相关标签
  

闽ICP备14008679号