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

题干

LeetCode#494 Target Sum题解(C++版)_第1张图片

原题网址:
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);
    }
};

你可能感兴趣的:(LeetCode题解)