• subsets


    该篇总结了leetcode中 78. Subsets 和 90. Subsets II,主要算法思想是DFS

    78. Subsets

    Given a set of distinct integers, nums, return all possible subsets.

    Note: The solution set must not contain duplicate subsets.

    For example,
    If nums = [1,2,3], a solution is:

    [
      [3],
      [1],
      [2],
      [1,2,3],
      [1,3],
      [2,3],
      [1,2],
      []
    ]
    public class Solution {
        public List<List<Integer>> subsets(int[] nums) {
            List<List<Integer>> results = new ArrayList<List<Integer>>();
            
            if (nums == null) {
                return results;
            }
            
            if (nums.length == 0) {
                results.add(new ArrayList<Integer>());
                return results;
            }
            
            Arrays.sort(nums);
            helper(new ArrayList<Integer>(), nums, 0, results);
            return results;
        }
        
        
        // 递归三要素
        // 1. 递归的定义:在 Nums 中找到所有以 subset 开头的的集合,并放到 results
        //helper函数的参数: startIndex:从哪个下标开始将元素添加进子集;results:已经添加好的子集集合;subset:上次递归形成的子集,下次递归即要找以subset开头的集合
       
        private void helper(ArrayList<Integer> subset,
                            int[] nums,
                            int startIndex,
                            List<List<Integer>> results) {
            // 2. 递归的拆解
            // deep copy
            // results.add(subset);
            results.add(new ArrayList<Integer>(subset));
            
            for (int i = startIndex; i < nums.length; i++) {
                // [1] -> [1,2]
                subset.add(nums[i]);
                // 寻找所有以 [1,2] 开头的集合,并扔到 results
                helper(subset, nums, i + 1, results);
                // [1,2] -> [1]  注意回溯
                subset.remove(subset.size() - 1);
            }
            
        }
        
    }

    90. Subsets II

    Given a collection of integers that might contain duplicates, nums, return all possible subsets.

    Note: The solution set must not contain duplicate subsets.

    For example,
    If nums = [1,2,2], a solution is:

    [
      [2],
      [1],
      [1,2,2],
      [2,2],
      [1,2],
      []
    ]
    public class Solution {
        public List<List<Integer>> subsetsWithDup(int[] nums) {
            
            Arrays.sort(nums);
            
            List<List<Integer>> results = new ArrayList<List<Integer>>();
            
            if(nums == null){
                return results;
            }
            
            if(nums.length == 0){
                results.add(new ArrayList<Integer>());
                return results;
            }
            
            helper(results, new ArrayList<Integer>(), nums, 0);
            
            return results;
        }
        
        private void helper(List<List<Integer>> results, ArrayList<Integer> list, int[] nums, int startIndex){
            
            results.add(new ArrayList<Integer>(list));
            
            for(int i = startIndex; i < nums.length; i++) {
                //与78.subsets比只增加了这一句
                if(i != startIndex && nums[i] == nums[i-1]){
                    continue;
                }
    
                list.add(nums[i]);
                helper(results, list, nums, i+1);
                list.remove(list.size() - 1);
            }
        }
    }
  • 相关阅读:
    听较强节奏的歌曲,能让你更长时间投入到学习中
    小康网站维护笔记
    apache基础
    python安装多版本
    apache负载调优
    docker 进阶
    openstack 网络更改版
    linux 搭建testlink的问题总结
    26. Remove Duplicates from Sorted Array(LeetCode)
    Add to List 172. Factorial Trailing Zeroes(LeetCode)
  • 原文地址:https://www.cnblogs.com/bubbleStar/p/6876159.html
Copyright © 2020-2023  润新知