zoukankan      html  css  js  c++  java
  • leetcode刷题笔记九十题 子集II

    leetcode刷题笔记九十题 子集II

    源地址:90. 子集 II

    问题描述:

    给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

    说明:解集不能包含重复的子集。

    示例:

    输入: [1,2,2]
    输出:
    [
    [2],
    [1],
    [1,2,2],
    [2,2],
    [1,2],
    []
    ]

    /**
    本题参考72题回溯方法,其关系类似46 47全排列两道题,需要在回溯的基础进行剪枝,本题剪枝操作主要是在同层剪枝,即nums(i) != nums(i-1)
    在进行剪枝的问题上,如果能够画图分析剪枝,能有极大帮助。
    */
    import scala.collection.mutable
    import util.control.Breaks._
    object Solution {
        def subsetsWithDup(nums: Array[Int]): List[List[Int]] = {
            val length = nums.length
            if (length == 0) return List()
    
            val sortedNums = nums.sorted
            var path = new mutable.ListBuffer[Int]()
            var res  = new mutable.ListBuffer[List[Int]]()
    
            def dfs(nums: Array[Int], depth: Int, index: Int): Unit = {
                if(path.length == depth){
                    res += path.toList
                    return
                }
            
                
                for(i <- index to nums.length - (depth - path.length)){
                    breakable{
                        if(i > index && nums(i) == nums(i-1)) break()
                        path += nums(i)
                        dfs(nums, depth, i+1)
                        path = path.dropRight(1)
                    }
                }
                
               
        }
    
            for (i <- 1 to length)  dfs(sortedNums, i, 0)
            return List()::res.toList
            
        }
    
    }
    
  • 相关阅读:
    Spring的声明试事务
    spring-AOP-添加日志
    弹窗插件
    工厂设计模式
    smartUpload组件批量下载
    简单的C++委托 —— 用模板类实现类成员函数的回调
    偷Microsoft师学MFC艺:且看C++如何支持反射
    C++中回调(CallBack)的使用方法
    epoll 使用实例
    C++成员函数指针的应用
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13399243.html
Copyright © 2011-2022 走看看