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];
    }
};
相关推荐
蓝色汪洋1 小时前
xtu oj矩阵
算法
hh随便起个名7 小时前
力扣二叉树的三种遍历
javascript·数据结构·算法·leetcode
写写闲篇儿7 小时前
微软面试之白板做题
面试·职场和发展
Dingdangcat868 小时前
城市交通多目标检测系统:YOLO11-MAN-FasterCGLU算法优化与实战应用_3
算法·目标检测·目标跟踪
tang&9 小时前
滑动窗口:双指针的优雅舞步,征服连续区间问题的利器
数据结构·算法·哈希算法·滑动窗口
拼命鼠鼠9 小时前
【算法】矩阵链乘法的动态规划算法
算法·矩阵·动态规划
LYFlied9 小时前
【每日算法】LeetCode 17. 电话号码的字母组合
前端·算法·leetcode·面试·职场和发展
式51610 小时前
线性代数(八)非齐次方程组的解的结构
线性代数·算法·机器学习
橘颂TA11 小时前
【剑斩OFFER】算法的暴力美学——翻转对
算法·排序算法·结构与算法
叠叠乐11 小时前
robot_state_publisher 参数
java·前端·算法