【Golang】LeetCode 416. 分割等和子集

416. 分割等和子集

题目描述

思路

这道题其实经过一次问题转换之后将会变得很简单。首先,我们应该对整个数组求和,然后判断和ssum是否为偶数。如果ssum为奇数,它甚至不能够被2整除,就更不存在得到两部分元素和相等的可能性了,直接返回false;否则,target = ssum / 2就是我们要找的元素和,问题转换为:从给定的数组nums中寻找一个子序列,满足子序列的和为target

由此,我们可以使用动态规划快速解决这个问题,它本质上就是一个数组中每种元素只能用一次的「零钱兑换」问题。我们维护一个dp bool 序列,用来表示当前数值i是否能使用数组当中的元素通过加和的方式表示出来。使用双层循环来对dp进行维护。最外层循环inums数组当中的元素进行遍历,因为每个元素只能用一次;第二层循环使用变量j从大到小对target进行遍历,如果满足j >= nums[i],令dp[j] = dp[j] || dp[j - nums[i]]

最终返回dp[target]即为最终答案。

Golang 题解

go 复制代码
func canPartition(nums []int) bool {
    // 整个数组的和必须是偶数, 否则直接返回 False
    // 然后要做的就是在数组当中挑选数值, 看一下是否恰好能够满足挑选的数的和 == sum / 2
    ssum := 0
    for _, num := range nums {
        ssum += num
    }

    if ssum % 2 == 1 {
        return false
    }

    target := ssum / 2
    dp := make([]bool, target + 1)
    dp[0] = true

    for i := 0; i < len(nums); i ++ {
        for j := target; j >= nums[i]; j -- {
            dp[j] = dp[j] || dp[j - nums[i]]
        }
    }

    return dp[target]
}
相关推荐
xiaokcehui3 小时前
地球物理大地测量学计算系列之十七局部重力场SRBF逼近及其性能指标测评
人工智能·算法·机器学习
Navigator_Z4 小时前
LeetCode //C - 1221. Split a String in Balanced Strings
c语言·算法·leetcode
天疆说4 小时前
庞特里亚金极小值原理的详细推导
算法
余俊晖4 小时前
Self-OPD:去掉教师机的流匹配模型 On-Policy 蒸馏
人工智能·算法·机器学习
手写码匠4 小时前
华为云Flexus+DeepSeek征文|华为云MaaS DeepSeek推理服务 × Flexus云服务器 × Dify一键部署:性能评测实战
人工智能·深度学习·算法·aigc
啥都想学点的研究生5 小时前
一篇文章讲清楚:逻辑回归
算法·机器学习·逻辑回归
货拉拉技术6 小时前
Agent 场景下 Token 成本优化的实战技巧
算法
hahaha60166 小时前
HLS高层次综合设计技巧--循环merge和循环split
人工智能·算法·计算机视觉
JAI科研6 小时前
Deepseek Agent Harness教程(七) | Deepseek Harness不是一个内核加一堆插件
开发语言·人工智能·深度学习·算法·自然语言处理·transformer·vllm
集思广益的灰太狼7 小时前
变频器启动致PLC数据异常?西门子G120配合滤波器EMC抑制方案
人工智能·算法·工控·emc·电磁兼容·变频器·西门子