目标和 (Target Sum)

 

思路:回溯

// @Title: 目标和 (Target Sum)
// @Author: qisiii
// @Date: 2024-09-25 19:42:11
// @Runtime: 638 ms
// @Memory: 40.2 MB
// @comment: 回溯
// @flag: BLUE
class Solution {
    int count = 0;

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

    private void dfs(int[] nums, int cur, int target, int sum) {
        if (cur == nums.length) {
            if (sum == target) {
                count++;
            }
            return;
        }
        dfs(nums, cur + 1, target, sum + nums[cur]);
        dfs(nums, cur + 1, target, sum - nums[cur]);
    }
}

思路:动规+一堆细节,这个题完全没有解出来的快乐感

// @Title: 目标和 (Target Sum)
// @Author: qisiii
// @Date: 2024-09-25 19:09:48
// @Runtime: 3 ms
// @Memory: 42.4 MB
// @comment: 动规+一堆细节,这个题完全没有解出来的快乐感
// @flag: GREEN
class Solution {
    public int findTargetSumWays(int[] nums, int target) {
        int sum=0;
        for(int i:nums){
            sum+=i;
        }
        //如[1] 2这种状况
        if(sum<target){
            return 0;
        }
        //即得不到一个合理的结果值
        if((sum+target)%2!=0){
            return 0;
        }
        target=(sum+target)/2;
        if(target<0){
            return 0;
        }
        int[][] dp=new int[nums.length][target+1];
        for(int j=0;j<=target;j++){
            if(nums[0]==j){
                dp[0][j]=1;
            }
        }
        int zeroNum=0;
        for(int i=0;i<nums.length;i++){
            if(nums[i]==0){
                zeroNum++;
            }
            dp[i][0]=(int)Math.pow(2,zeroNum);
        }
        for(int i=1;i<nums.length;i++){
            for(int j=1;j<=target;j++){
                if(j<nums[i]){
                    dp[i][j]=dp[i-1][j];
                }else{
                    dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i]];
                }
            }
        }
        return dp[nums.length-1][target];
    }
}
Licensed under CC BY-NC-SA 4.0
最后更新于 2024-10-18