LeetCode 热题 HOT 100Java题解之494. 目标和(击败了9.25%的用户)

 题目:

给你一个整数数组 nums 和一个整数 target 。

向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 :

例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。
返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。


示例:

输入: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


思路:

找到各种可能性基本上就是暴力循环,也就是回溯,就是怎么实现的问题。

要把回溯的结构记清楚。

这样的效率很差好像可以用动规去做。但是这样比较清除。

复杂度:


时间复杂度:相当于双重遍历O(2^n) 

空间复杂度:O(1)

代码:

//定义全局变量,记录方案数
    int count = 0;

    public int findTargetSumWays(int[] nums, int target) {
        backtracking(nums,target,0,0);
        return count;
    }

    private void backtracking(int[] nums,int target,int index,int sum){
        //终止条件
        if(index == nums.length){
            count += sum == target ? 1 : 0;
            return;
        }
        backtracking(nums,target,index+1,sum+nums[index]);
        backtracking(nums,target,index+1,sum-nums[index]);
    }

LeetCode 热题 HOT 100Java题解之494. 目标和(击败了9.25%的用户)_第1张图片

 

你可能感兴趣的:(LeetCode,热题,HOT,100,随机开始,leetcode,散列表,数据结构,java,算法)