• [Swift]LeetCode416. 分割等和子集 | Partition Equal Subset Sum


    原文地址:https://www.cnblogs.com/strengthen/p/10331729.html 

    Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.

    Note:

    1. Each of the array element will not exceed 100.
    2. The array size will not exceed 200. 

    Example 1:

    Input: [1, 5, 11, 5]
    
    Output: true
    
    Explanation: The array can be partitioned as [1, 5, 5] and [11]. 

    Example 2:

    Input: [1, 2, 3, 5]
    
    Output: false
    
    Explanation: The array cannot be partitioned into equal sum subsets.

    给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

    注意:

    1. 每个数组中的元素不会超过 100
    2. 数组的大小不会超过 200

    示例 1:

    输入: [1, 5, 11, 5]
    
    输出: true
    
    解释: 数组可以分割成 [1, 5, 5] 和 [11]. 

    示例 2:

    输入: [1, 2, 3, 5]
    
    输出: false
    
    解释: 数组不能分割成两个元素和相等的子集.

    32ms
     1 class Solution {
     2     var mark = [String : Bool]()
     3     func canPartition(_ nums: [Int]) -> Bool {
     4         let count = nums.count
     5         var sum = 0
     6         for i in 0..<count {
     7             sum += nums[i]
     8         }
     9         
    10         if sum & 1 == 1 {
    11             return false
    12         }
    13         return reachTarget(nums, count, 0, sum / 2)
    14     }
    15     
    16     func reachTarget(_ nums: [Int], _ count: Int, _ index: Int, _ target: Int) -> Bool {
    17         let key = "(index),(target)"
    18         if let _ = mark[key] {
    19             return false
    20         }
    21         if target == 0 {
    22             return true
    23         } else if target < 0 {
    24             return false
    25         }
    26         if index == count {
    27             return false
    28         }
    29         
    30         if reachTarget(nums, count, index + 1, target - nums[index]) {
    31             return true
    32         }
    33         if reachTarget(nums, count, index + 1, target) {
    34             return true
    35         }
    36         
    37         mark[key] = false
    38         return false
    39     }
    40 }

    40ms

     1 class Solution {
     2   func canPartition(_ nums: [Int]) -> Bool {
     3     var sum = 0
     4     for num in nums {
     5       sum += num
     6     }
     7 
     8     if sum % 2 == 1 {
     9       return false
    10     }
    11     let numsCount = nums.count
    12     let target = sum / 2
    13     let invalidArray = Array(repeating: false, count: target + 1)
    14     var invalidMatrix = Array(repeating: invalidArray, count: numsCount + 1)
    15     return helper(nums: nums, currentIndex: 0, target: target, invalidMatrix: &invalidMatrix)
    16   }
    17 
    18   func helper(nums: [Int], currentIndex: Int, target: Int, invalidMatrix: inout [[Bool]]) -> Bool {
    19     if invalidMatrix[currentIndex][target] {
    20       return false
    21     }
    22 
    23     let arrayCount = nums.count
    24     for i in currentIndex ..< arrayCount {
    25       let newTarget = target - nums[i]
    26       if newTarget == 0 {
    27         return true
    28       }
    29       if newTarget < 0 {
    30         break
    31       }
    32 
    33       if (i + 1) < arrayCount
    34         && helper(nums: nums, currentIndex: i + 1, target: newTarget, invalidMatrix: &invalidMatrix) {
    35         return true
    36       }
    37     }
    38     invalidMatrix[currentIndex][target] = true
    39     return false
    40   }
    41 }

    3456ms

     1 class Solution {
     2     func canPartition(_ nums: [Int]) -> Bool {
     3         var sum:Int = nums.reduce(0, +)
     4         var target:Int = sum >> 1
     5         if (sum & 1) == 1 {return false}
     6         var dp:[Bool] = [Bool](repeating:false,count:target + 1)
     7         dp[0] = true
     8         for num in nums
     9         {
    10             if num > target {continue}
    11             for i in (num...target).reversed()
    12             {
    13                 dp[i] = dp[i] || dp[i - num]
    14             }
    15         }
    16         return dp[target]
    17     }
    18 }

    3504ms

     1 class Solution {
     2     func canPartition(_ nums: [Int]) -> Bool {
     3         var nums = nums
     4         if nums.count == 0 {
     5             return true
     6         }
     7         var sum = 0 
     8         nums = nums.sorted()
     9         for num in nums {
    10             sum += num
    11         }
    12         if sum % 2 != 0 {
    13             return false
    14         }
    15         sum = sum / 2
    16         if nums.last! > sum {
    17             return false
    18         }
    19         var dp = [Bool](repeating: false, count: sum + 1)
    20         dp[0] = true
    21         for i in 1...nums.count {
    22             for j in (nums[i - 1]...sum).reversed() {
    23                 dp[j] = dp[j] || dp[j - nums[i - 1]]
    24             }
    25         }
    26         return dp[sum]
    27     }
    28 }
  • 相关阅读:
    雅虎前端优化的35条军规
    React+Dva
    React Component(dva)
    JavaScript(基于react+dva)
    混合开发的优缺点
    前端各种面试题大全带详细答案
    web前端面试题必看
    localStorage新手必看不容错过
    htm5+css3+js的动画效果
    关于gulp的应用
  • 原文地址:https://www.cnblogs.com/strengthen/p/10331729.html
Copyright © 2020-2023  润新知