首页 > 其他分享 >LeetCode 494.目标和

LeetCode 494.目标和

时间:2023-08-11 23:34:26浏览次数:40  
标签:target nums int sum 目标 494 LeetCode dp left

1.题目:


https://leetcode.cn/problems/target-sum/description/


给你一个非负整数数组 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



2.代码:

class Solution {
    public int findTargetSumWays(int[] nums, int target) {
        int sum=0; 
        for(int i:nums){
            sum+=i;
        }
        if(target<0 && sum<-target) return 0;//就是sum小于target的绝对值就返回0
        if((target+sum)%2 != 0) return 0;//当正数的个数的两倍不是偶数的时候,那么就不成立
        int left=(target+sum)/2;//这里的left表示的是正数的个数
        if(left<0) left=-left;//当left是负数的时候,把它全变成正
        int[] dp = new int[left+1];
        dp[0]=1;//初始化,表示一种方法,注意这里的的1表示的是方法
        for(int i=0;i<nums.length; i++){
            for(int j=left; j>=nums[i]; j--){
                dp[j]+=dp[j-nums[i]];//一个全新的不同于普通01背包的递推公式
            }
        }
        return dp[left];
    }
}


注意这里有好几种返回0的条件

推导:left+right=sum; left-right=target; right=sum-left; 

==>left=(target+sum)/2;

注意这里的递推公式,其实可以理解为每一个阶段的方法的累加,跟楼梯那个类似

例如:dp[j],j 为5,

  • 已经有一个1(nums[i]) 的话,有 dp[4]种方法 凑成 容量为5的背包。
  • 已经有一个2(nums[i]) 的话,有 dp[3]种方法 凑成 容量为5的背包。
  • 已经有一个3(nums[i]) 的话,有 dp[2]中方法 凑成 容量为5的背包
  • 已经有一个4(nums[i]) 的话,有 dp[1]中方法 凑成 容量为5的背包
  • 已经有一个5 (nums[i])的话,有 dp[0]中方法 凑成 容量为5的背包

那么凑整dp[5]有多少方法呢,也就是把 所有的 dp[j - nums[i]] 累加起来。










标签:target,nums,int,sum,目标,494,LeetCode,dp,left
From: https://blog.51cto.com/u_15806469/7054040

相关文章

  • LeetCode 刷题难?动画图解才是正确姿势!
    BAT等国内的一线名企,在招聘工程师的过程中,对算法和数据结构都会重点考察。但算法易学难精,我的很多粉丝技术能力不错,但面试时总败在算法这一关,拿不到好Offer。但说实话,数据结构和算法花点时间,用对方法,很容易解决。面试官为什么爱问数据结构与算法,答案很简单:算法能力能够准确辨别一......
  • LeetCode 1049.最后一块石头的重量II
    1.题目:1049. 最后一块石头的重量II有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x<=y。那么粉碎的可能结果如下:如果 x==y,那么两块石头都会被完全粉......
  • Leetcode 977. 有序数组的平方(Squares of a sorted array)
    题目链接给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序.示例1:输入:nums=[-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为[16,1,0,9,100]排序后,数组变为[0,1,9,16,100]示例2:输入:nums=[-7,-3,2,3,11]输......
  • Tita 升级|绩效「总评语多维度拓展」+「目标值开关设置」
    升级详情一、总评语多维度拓展详细介绍:Tita-OKR和新绩效一体化管理平台考核模板-设置员工自评/同事评价/上级评价节点,勾选「总评语」,点击「高级设置」,进入设置;支持功能支持总结主题增删改查操作;支持自由拖动调整总结主题前后顺序;支持「总结主题」设置必填;考核详情-总......
  • Leetcode 27. 移除元素(Remove Element)
    题目链接给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度.不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组.元素的顺序可以改变.你不需要考虑数组中超出新长度后面的元素.说明:为什么返回数值是整数,但输......
  • Leetcode167. 两数之和 II - 输入有序数组(双指针)
    题目:两数之和II-输入有序数组(双指针)给你一个下标从1开始的整数数组numbers,该数组已按非递减顺序排列,请你从数组中找出满足相加之和等于目标数target的两个数。如果设这两个数分别是numbers[index1]和numbers[index2],则1<=index1<index2<=numbers.length......
  • LeetCode -- 827. 最大人工岛
      题目大意:给一个邻接矩阵,问改变一个点后,最大连通块多大对于这种连通块相关问题,一般的思路就是进行深搜和并查集,这里采用并查集维护连通块大小解法。首先先初始化并查集,并进行连通块的合并;再对图中的0进行枚举,找到最大的连通块即可。对(n*m)的二维点阵图常用技巧,二维转一......
  • LeetCode从算法到算命—1281.整数的各位积和之差(20230809)
    1281.整数的各位积和之差题目信息给你一个整数n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。示例1:输入:n=234输出:15解释:各位数之积=2*3*4=24各位数之和=2+3+4=9结果=24-9=15示例2:输入:n=4421输出:21解释:各位......
  • 有效的括号--LeetCode算法
    不用map的解法publicbooleanisValid(Strings){//输入的字符串为空,直接返回trueif(s.isEmpty())returntrue;//新建一个栈Stack<Character>stack=newStack<Character>();//遍历传入的字符串//如果时"(","{","["就......
  • #yyds干货盘点# LeetCode程序员面试金典:添加与搜索单词 - 数据结构设计
    题目:请你设计一个数据结构,支持添加新单词和查找字符串是否与任何先前添加的字符串匹配。实现词典类WordDictionary:WordDictionary()初始化词典对象voidaddWord(word)将word添加到数据结构中,之后可以对它进行匹配boolsearch(word)如果数据结构中存在字符串与 word匹......