LeetCode 494. 目标和

对于这题,我们可以用回溯解决,枚举所有的 + - 组合,求出答案等于target的组合个数。也可以利用动态规划来解决,且更高效。

对于 nums ,我们可以依据每个元素前面的符号来将其分为两个集合P Q,其中P为前面加正号的数,Q为前面加负号的数。

故sum(P)−sum(Q)=targetsum(P) - sum(Q) = targetsum(P)−sum(Q)=target。

又因为sum(P)+sum(Q)=sum(nums)sum(P) + sum(Q) = sum(nums)sum(P)+sum(Q)=sum(nums)

则2×sum(P)=target+sum(nums)2\times sum(P) = target + sum(nums)2×sum(P)=target+sum(nums)

其结构与 416. 分割等和子集 一模一样。

c++ 复制代码
class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int target) {
        int sum = target + accumulate(nums.begin(), nums.end(), 0);
        if(sum%2 || sum<0) return 0;
        sum /= 2;
        vector<int> dp(sum + 1, 0);
        dp[0] = 1;
        for(auto x : nums){
            for(int i = sum;i >= x;i--){
                dp[i] = dp[i] + dp[i-x];
            }
        }
        return dp[sum];
    }
};
相关推荐
专注仿真41 分钟前
问答大模型技术方案算法实现-RAPTOR树构建算法与BEG集成使用
python·算法
zlinear数据采集卡1 小时前
数据采集卡从入门到精通(10):采样率与分辨率的核心关系——反比律、架构分布与过采样
arm开发·嵌入式硬件·算法·fpga开发·架构·开源
GeekZHR2 小时前
C语言指针进阶补充6:动态内存管理、mem系列内存函数、复杂指针声明,一次补齐指针的“三大盲区“
java·c语言·算法·指针
Herbert_hwt3 小时前
第七章 Java深入理解枚举类型
java·开发语言·算法
.道阻且长.3 小时前
8.LeetCode算法习题讲解--滑动窗口--长度最小的子数组
算法·leetcode·职场和发展
(❁´◡`❁)Jimmy(❁´◡`❁)3 小时前
P1156 [USACO01OPEN] 垃圾陷阱
算法·动态规划
疯狂打码的少年3 小时前
【数据结构】二叉排序树(BST)的定义与操作
数据结构·笔记·算法
lally.3 小时前
整数等差数列超图中的三个非微扰现象
算法
wabs6663 小时前
关于字符串【力扣541.反转字符串II的思考】
数据结构·算法·leetcode·字符串
土司大王4 小时前
LeetCode hot100——移动零
java·算法·leetcode