递归、搜索与回溯-综合练习:19.目标和

题目链接:494. 目标和(中等)

算法原理:

解法:递归

Java代码:

java 复制代码
/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 王洋
 * Date: 2025-10-02
 * Time: 23:31
 */
class Solution {
    //自己写了一遍之后找豆包改的,注释处是改动点
    int[] path;
    int ret,n;
    public int findTargetSumWays(int[] nums, int target) {
        path=new int[nums.length];
        ret=0;n=0;
        dfs(nums,target);
        return ret;
    }
    public void dfs(int[] nums,int target){
        if(n==nums.length){//不是path.length==nums.length因为这一直成立
            int sum=0;
            for(int x:path) sum+=x;
            if(sum==target) ret++;
            return ;
        }
        //加号
        path[n]=nums[n++];
        dfs(nums,target);
        n--;//无需手动置为0:path[n--]=0;因为如果dfs时已经满足返回条件,那这一句就会数组越界
        //减号
        path[n]=-nums[n++];
        dfs(nums,target);
        n--;//回溯到当前索引
    }
    //吴小哲教的path全局变量写法
    int ret,aim,path;
    public int findTargetSumWays(int[] nums, int target) {
        ret=0;aim=target;
        dfs(nums,0);
        return ret;
    }
    public void dfs(int[] nums,int pos){
        if(pos==nums.length){
            if(path==aim) ret++;
            return ;
        }
        //加法
        path+=nums[pos];
        dfs(nums,pos+1);
        path-=nums[pos];//恢复现场
        //减法
        path-=nums[pos];
        dfs(nums,pos+1);
        path+=nums[pos];//恢复现场
    }
    //吴小哲教的path局部变量写法
    int ret,aim;
    public int findTargetSumWays(int[] nums, int target) {
        ret=0;aim=target;
        dfs(nums,0,0);
        return ret;
    }
    public void dfs(int[] nums,int pos,int path){
        if(pos==nums.length){
            if(path==aim) ret++;
            return ;
        }
        //加法
        dfs(nums,pos+1,path+nums[pos]);
        //减法
        dfs(nums,pos+1,path-nums[pos]);
    }
}
相关推荐
jieyucx几秒前
Go 零基础数据结构:顺序表(像「排抽屉」一样学增删改查)
java·数据结构·golang
曦夜日长1 分钟前
C++ STL容器string(一):string的变量细节、默认函数的认识以及常用接口的使用
java·开发语言·c++
想唱rap6 分钟前
应用层协议与序列化
linux·运维·服务器·网络·数据结构·c++·算法
北山有鸟8 分钟前
IS_ERR 判断出错后,再用 PTR_ERR 把它强制转换回 int 型的错误码作为函数的返回值。
java·开发语言
重生之我是Java开发战士12 分钟前
【笔试强训】Week3:重排字符串,分组,DNA序列
算法
We་ct14 分钟前
LeetCode 97. 交错字符串:动态规划详解
前端·算法·leetcode·typescript·动态规划
phltxy14 分钟前
深度解析:Spring Cloud Gateway 从入门到实战
java·开发语言
热心网友俣先生18 分钟前
2026年第二十三届五一数学建模竞赛B题四问参考答案+多算法对比
算法·数学建模
HAPPY酷18 分钟前
从Public到Private:UE5 C++类创建路径差异全解析
java·c++·ue5
无敌昊哥战神18 分钟前
【LeetCode 37】解数独 (Sudoku Solver) —— 回溯法详解 (Python/C/C++)
c语言·c++·python·算法·leetcode