正品率最高的购物网站,网站建设硬件方案,刚察网站建设公司,麻城建设局网站停办1. 题目链接#xff1a;494. 目标和
2. 题目描述#xff1a; 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - #xff0c;然后串联起所有整数#xff0c;可以构造一个 表达式 #xff1a; 例如#xff0c;nums [2, 1] #xff0c;可…1. 题目链接494. 目标和
2. 题目描述 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - 然后串联起所有整数可以构造一个 表达式 例如nums [2, 1] 可以在 2 之前添加 在 1 之前添加 - 然后串联起来得到表达式 2-1 。 返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。 示例 1 输入nums [1,1,1,1,1], target 3
输出5
解释一共有 5 种方法让最终目标和为 3 。
-1 1 1 1 1 3
1 - 1 1 1 1 3
1 1 - 1 1 1 3
1 1 1 - 1 1 3
1 1 1 1 - 1 3示例 2 输入nums [1], target 1
输出1提示 1 nums.length 200 nums[i] 10000 sum(nums[i]) 1000-1000 target 1000 3. 解法回溯
3.1 算法思路
对于每个数可以选择加上或减去它依次枚举每一个数字在每个数都被选择时检查得到的和是否等于目标值。如果等于则记录结果。
需要注意的是为了优化时间复杂度可以提前计算出数组中所有数字的和以及数组的长度。这样可以快速判断当前的和减去剩余的数是否已经超过了目标值target或者当前的和加上剩下的数的和是否小于目标值target如果满足条件则可以直接回溯
3.2 递归流程 递归结束条件pos与数组长度相等判断当前状态的path是否与目标值相等若是计数加一 选择当前元素进行加操作递归下一个位置并更新参数path 选择当前元素进行减操作递归下一个位置并更新参数path 3.3 C算法代码
class Solution {int ret, aim; // ret用于记录满足条件的路径数量aim用于存储目标和
public:int findTargetSumWays(vectorint nums, int target) {aim target; // 初始化目标和dfs(nums, 0, 0); // 从数组的第一个元素开始搜索return ret; // 返回满足条件的路径数量}void dfs(vectorint nums, int pos, int path) {if (pos nums.size()) { // 如果已经遍历完数组if (path aim) ret; // 如果当前路径的和等于目标和则增加满足条件的路径数量return; // 结束当前递归}dfs(nums, pos 1, path nums[pos]); // 选择当前元素将其加入路径中继续搜索下一个元素dfs(nums, pos 1, path - nums[pos]); // 不选择当前元素将当前元素从路径中移除继续搜索下一个元素}
};