美文网首页
47. 全排列 II

47. 全排列 II

作者: 邦_ | 来源:发表于2022-08-04 09:41 被阅读0次

想着在原来全排列的基础上做个去重复的。。 结果时间复杂度上就上去了多了o(n)级别 = =


class Solution {
    func permuteUnique(_ nums: [Int]) -> [[Int]] {
        
        
        var ans = Array<Array<Int>>()
        
        let len = nums.count

        var useArray = Array.init(repeating: 0, count: len)
        var tempArray = Array.init(repeating: 0, count: len)

       dfs(0,nums,&useArray,&tempArray,&ans)
        
    
        return ans
    }
    func dfs(_ index:Int,_ nums:[Int],_ useArray:inout Array<Int>,_ tempArray: inout Array<Int>,_ ans: inout [[Int]]){
        
        let len = nums.count
        if index == len {
            let temp = Array.init(tempArray)
            if !ans.contains(temp){
                ans.append(temp)
            }
            return
        }
        //每一层可以选择的
        for i in 0..<len {
            
            if useArray[i] == 0 {
                tempArray[index] = nums[i]
                useArray[i] = 1
                dfs(index + 1,nums,&useArray,&tempArray,&ans)
                useArray[i] = 0
            }
        }
        
        
        
    }
}



优化版本1 通过省去了成员变量 速度提升了一点。但是还是不太好。应该在结果出来之前进行过滤。而不是最后


func permuteUnique(_ nums: [Int]) -> [[Int]] {
        
        
        var ans = Array<Array<Int>>()
        var temp = nums

       dfs(0,&temp,&ans)
        
    
        return ans
    }
    func dfs(_ index:Int,_ nums: inout [Int],_ ans: inout [[Int]]){
        
        let len = nums.count
        if index == len {
            let temp = Array.init(nums)
            if !ans.contains(temp){
                ans.append(temp)
            }
            return
        }
        //每一层可以选择的
        for i in index..<len {
            
            nums.swapAt(index, i)
            dfs(index + 1,&nums,&ans)
            nums.swapAt(index, i)
           
        }
        
        
        
    }


优化版本2

func permuteUnique(_ nums: [Int]) -> [[Int]] {
            
            
            var ans = Array<Array<Int>>()
            var temp = nums

           dfs(0,&temp,&ans)
            
        
            return ans
        }
        func dfs(_ index:Int,_ nums: inout [Int],_ ans: inout [[Int]]){
            
            let len = nums.count
            if index == len {
                ans.append(Array.init(nums))

                return
            }
            //每一层可以选择的
            for i in index..<len {
                if isRepeat(nums, index, i) {
                    continue
                }
                nums.swapAt(index, i)
                dfs(index + 1,&nums,&ans)
                nums.swapAt(index, i)
               
            }
            
        }
        
        func isRepeat(_ nums:[Int],_ index:Int, _ i:Int) -> Bool{
            
            for j in index..<i {
                if nums[j] == nums[i] {
                    return true
                }
            }
            
            return false

        }










相关文章

  • 47. 全排列 II

    47. 全排列 II[https://leetcode.cn/problems/permutations-ii/]...

  • 47. 全排列 II、39. 组合总和、40. 组合总和 II

    回溯的题 47. 全排列 II[https://leetcode-cn.com/problems/permutat...

  • YC-常考的题目

    46. 全排列 47. 全排列 II 有条件的全排列,打印出[1,2,2,3,4,5]的所有4不在头并且3和5不挨...

  • 搜索(二)回溯

    一、题目总结 基础问题 46.全排列 77.组合 78.子集 39.组合求和 47.全排列 II(重复元素) 90...

  • 47.全排列II

    题目给定一个可包含重复数字的序列,返回所有不重复的全排列。 示例:****输入: [1,1,2]输出:[[1,1,...

  • 47. 全排列 II

    给定一个可包含重复数字的序列,返回所有不重复的全排列。 示例: 思路 python3解法 来源:力扣(LeetCo...

  • 47. 全排列ii

    1. 题目描述 给定一个可包含重复数字的序列,返回所有不重复的全排列。 2. 解题思路 计算一个map,统计各个元...

  • 47.全排列II

    自己解法 这题解法和全排列类似,只用对同层相同的分支进行剪枝,有点忘了在哪剪了,还是放在后面剪比较好理解,回溯完以...

  • 47. 全排列 II

    思路 排序,人为规定顺序去重。 深搜+回溯

  • 47. 全排列 II

    解法

网友评论

      本文标题:47. 全排列 II

      本文链接:https://www.haomeiwen.com/subject/cffdirtx.html