当前位置: 首页 > 后端技术 > Python

力扣494,目标和Python实现

时间:2023-03-26 19:23:47 Python

题目要求:思路:画表可以发现数组所有元素之和为5,所以画一个(5*2+1)len(nums)的表(即二维数组)-5~5表示对这个数组的每个元素进行加减运算,得到从[-1-1-1-1-1]到[+1+1+1+1+1]所有可能的遍历数组的所有可能值,当遍历到达数组下标为0的元素,即第一个1时,它和正负号的组合有两种:1和-1,所以有一种方法可以得到-1,以及一种获取1的方法,当遍历到数组下标为1的元素时,之前已经获取到的可能结果值为-1和1。然后在此基础上,对1和正负进行新的组合可能加上符号,可能得到-2(-1-1),有可能得到0(-1+1或+1-1),有可能得到2(+1+1),所以在-2的位置有一种方法,在0的位置有2种方法,在1的位置有一种一种依次遍历。遍历到末尾的时候,找到目标值对应的列的最后一行,即3对应的方法有5个,就返回5即可。特别注意:当数组的第一行元素为0时,0的position方法要初始化为2,因为0+0=0,0-0=0核心代码:dp=[[0foriinrange(2*total+1)]forjinrange(len(nums))]#如果数组第一个元素为0,则+0或-0,结果为0ifnums[0]==0:dp[0][total]=2else:#total是和dp行中元素值为0的元素的下标dp[0][total+nums[0]]=1dp[0][total-nums[0]]=1foriinrange(1,len(dp)):forjinrange(len(dp[0])):#注意边界#在第一个图中,dp[4][0]的当前元素值为1,对应的目标值为-5,那么-5加减1可能就是上一行得到的值,但是需要注意的是-5-1,即-6没有考虑。#left和right都初始化为0,是的因为在表中,也就是二维数组中,0所在列对应的目标值是给定数组所有元素可能的最小值,即一个极值,所以没有走到最后一行,也就是没有遍历到最后一个数组元素取不到这个值,也就是所有行下标为0的位置(所有行的起始位置行)methodnumber必须为0,所以当left或right越界,没有赋新值时,不会影响计算methodnumberleft,right=0,0ifj-nums[i]>=0:left=j-nums[i]如果j+nums[i]<2*total+1:right=j+nums[i]dp[i][j]=dp[i-1][left]+dp[i-1][right]returndp[-1][total+S]完整代码:classSolution:deffindTargetSumWays(self,nums:List[int],S:int)->int:total=sum(nums)如果总计=0:left=j-nums[i]ifj+nums[i]<2*total+1:右=j+nums[i]dp[i][j]=dp[i-1][左]+dp[i-1][右]返回dp[-1][总计+S]