LeetCode#494 Target Sum题解(C++版)

本文针对LeetCode上的题目“目标和”提供了一种动态规划的解决方案。问题要求通过对一组数字添加正负号的方式使总和达到指定的目标值S。文章详细解释了解题思路,并附上了C++实现的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题干

这里写图片描述

原题网址:
https://leetcode.com/problems/target-sum/description/

题干解析

给你一组数据,和一个目标数据S,对那组数据进行处理(对数组中的每一个数,可以选择保持原值(即前面加上‘+’号),或者选它的相反数(即前面加上‘-’号)),要求那组数据最终的和等于S。

知识点

动态规划

难度

中等

解题思路

这道题可以用动态规划的思路来解。对于每个数,要么保持原值,要么取反,那么我们两种操作都尝试:如果保持原值的话,就将目标S减去本数原值,看看后面的数进行操作后能得到S减去本数原值的有多少种可能;如果取反的话,就将目标S加上本数,看看后面的数进行操作后能得到S加上本数原值的有多少种可能。再将上述两个加起来,即得到所有可能的值。判断终止的条件是,当已经遍历到剩下最后一个数,看看这个数或者这个数的相反数是否等于现在需要的目标值(已经不是原来的S,而是经过前面一系列的操作之后得到的新的目标)。只要想清楚这个过程,代码写起来非常简单。具体代码如下:

代码

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int S) {
        return help(nums, S, 0);
    }

    int help(vector<int>& nums, int S, int first) {
        if (first == nums.size()) {
            return 0;
        }
        if (first == nums.size() - 1) {
            if (S == 0 && nums[first] == 0) {
                return 2;
            }
            if (S == nums[first] || (-1) * S == nums[first]) {
                return 1;
            }
            return 0;
        }
        return help(nums, S - nums[first], first + 1) + help(nums, S + nums[first], first + 1);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值