zoukankan      html  css  js  c++  java
  • [Swift]LeetCode47. 全排列 II | Permutations II

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/9907631.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    Given a collection of numbers that might contain duplicates, return all possible unique permutations.

    Example:

    Input: [1,1,2]
    Output:
    [
      [1,1,2],
      [1,2,1],
      [2,1,1]
    ]

    给定一个可包含重复数字的序列,返回所有不重复的全排列。

    示例:

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

    20ms
     1 class Solution {
     2     func permuteUnique(_ nums: [Int]) -> [[Int]] {
     3         var ans = [[Int]]()
     4         var nums = nums
     5         permuteUnique(&nums, 0, &ans)
     6         return ans
     7     }
     8     
     9     func permuteUnique(_ nums: inout [Int], _ startIndex: Int, _ ans: inout [[Int]]) {
    10         if startIndex >= nums.count {
    11             ans.append(nums)
    12         }
    13         
    14         var visited = Set<Int>()
    15         for index in startIndex..<nums.count {
    16             if visited.insert(nums[index]).inserted {
    17                 nums.swapAt(startIndex, index)
    18                 permuteUnique(&nums, startIndex+1, &ans)
    19                 nums.swapAt(startIndex, index)    
    20             }
    21         }
    22     }
    23 }

    24ms

     1 class Solution {
     2     func permuteUnique(_ nums: [Int]) -> [[Int]] {
     3         let sortedNums = nums.sorted()
     4         
     5         var temp = [Int]()
     6         var result = [[Int]]()
     7         var isvisited = Array(repeating: false, count: nums.count)
     8         
     9         backTracking(sortedNums, &result, &temp, &isvisited)
    10         return result 
    11     }
    12     
    13     func backTracking(_ nums: [Int], _ result: inout [[Int]], _ temp: inout [Int], _ isvisited: inout [Bool]) {
    14         if temp.count == nums.count {
    15             result.append(temp)
    16             return
    17         }
    18         
    19         for i in 0 ..< nums.count where !isvisited[i] {
    20             if i > 0 && nums[i] == nums[i - 1] && !isvisited[i - 1]{  
    21                 continue
    22             }
    23             temp.append(nums[i])
    24             isvisited[i] = true
    25             backTracking(nums, &result, &temp, &isvisited)
    26             isvisited[i] = false
    27             temp.removeLast()
    28         }
    29         
    30         
    31     }
    32 }

    44ms

     1 class Solution {
     2     private func backtrack(_ nums: [Int], _ begin: Int,  results: inout [[Int]]) {
     3         if begin == nums.count - 1 {
     4             results.append(nums)
     5             return
     6         }
     7 
     8         var nums = nums
     9 
    10         for i in begin..<nums.count {
    11             if i == begin || nums[i] != nums[begin]  {
    12                 nums.swapAt(begin, i)
    13                 backtrack(nums, begin + 1, results: &results)
    14             }
    15         }
    16     }
    17     
    18     func permuteUnique(_ nums: [Int]) -> [[Int]] {
    19         var results = [[Int]]()
    20         var nums = nums.sorted()
    21         backtrack(nums, 0, results: &results)
    22         return results
    23     }
    24 }

    56ms

     1 class Solution {
     2     func permuteUnique(_ nums: [Int]) -> [[Int]] {
     3         var res = [[Int]]()
     4         var index = 0
     5         var nums = nums
     6         helper(&res, index, &nums)
     7         return res
     8     }
     9     
    10     
    11     private func helper(_ res: inout [[Int]], _ index: Int, _ nums: inout [Int]) {
    12         if index == nums.count {
    13             res.append(nums)
    14             return
    15         }
    16         
    17         var usedSet = Set<Int>()
    18         for i in index..<nums.count {
    19             if usedSet.contains(nums[i]) {
    20                 continue
    21             }
    22             
    23             usedSet.insert(nums[i])
    24             nums.swapAt(index, i)
    25             helper(&res, index + 1, &nums)
    26             nums.swapAt(index, i)
    27         }
    28     }
    29 }

    60ms

     1 class Solution {
     2     var result = [[Int]]()
     3     func permuteUnique(_ nums: [Int]) -> [[Int]] {
     4         var nums = nums
     5         permute(&nums)
     6       return result
     7     }
     8     func permute(_ nums: inout [Int], _ index: Int = 0) {
     9       if index == nums.count{
    10             result.append(nums) 
    11           return
    12       }
    13         for i in index..<nums.count{
    14             if shouldSwap(nums, index, i){
    15                 nums.swapAt(index, i)
    16                 permute(&nums, index+1)
    17                 nums.swapAt(index, i) 
    18             }
    19         }
    20     }    
    21     
    22     func shouldSwap(_ nums:[Int],_ start: Int,_ current: Int) -> Bool{
    23         for i in start..<current{
    24             if nums[i] == nums[current]{
    25                 return false
    26             }
    27         }
    28         return true
    29     }
    30 }

    76ms

     1 class Solution {
     2     func permuteUnique(_ nums: [Int]) -> [[Int]] {
     3 
     4         var res = [[Int]]()
     5         var path = [Int]()
     6         let nums = nums.sorted()
     7         var isVisited = [Bool](repeating:false,count:nums.count)
     8         dfs(&res,&path,&isVisited,nums)
     9         return res
    10     }
    11 
    12     func dfs(_ res:inout [[Int]],_ path:inout [Int],_ isVisited:inout [Bool],_ nums:[Int]) {
    13         if path.count == nums.count {
    14             res.append(path)
    15             return
    16         }
    17 
    18         for (i,num) in nums.enumerated() {
    19             if isVisited[i] || (i > 0 && nums[i] == nums[i-1] && !isVisited[i-1]) {
    20                 continue
    21             }
    22 
    23                 path.append(num)
    24                 isVisited[i] = true
    25                 dfs(&res,&path,&isVisited,nums)
    26                 isVisited[i] = false
    27                 path.removeLast()
    28 
    29         }
    30     }
    31 
    32     func toString(_ array:[Int]) -> String {
    33         var str = ""
    34         for (i,num) in array.enumerated() {
    35             str = str + "(num)"
    36         }
    37 
    38         return str
    39     }
    40 }
  • 相关阅读:
    记一次网络实践
    python中得公有和私有——私有函数和公开函数_补充完整
    机器学习 之LightGBM算法
    机器学习 之XGBoost算法
    机器学习 之梯度提升树GBDT
    机器学习 之KNN近邻法
    机器学习之 XGBoost和LightGBM
    《剑指offer》 之二叉树
    随机森林RF、XGBoost、GBDT和LightGBM的原理和区别
    机器学习之决策树_CART算法
  • 原文地址:https://www.cnblogs.com/strengthen/p/9907631.html
Copyright © 2011-2022 走看看