一、494.目标和
1.题目描述
2.代码
3.思路
首先计算数组元素总和 sum
,若 target
的绝对值大于 sum
或者 target
与 sum
之和为奇数,说明无法达成目标,直接返回 0。接着计算出等价的背包容量 bagSize
。然后创建 dp
数组,将 dp[0]
初始化为 1,表示不选任何元素时和为 0 有一种方法。随后利用两层循环进行动态规划,外层遍历数组元素,内层从 bagSize
逆向遍历到当前元素值,更新 dp[j]
,将 dp[j - nums[i]]
累加到 dp[j]
上,最终 dp[bagSize]
即为满足目标值的方法数量。
二、474.一和零
1.题目描述
2.代码
3.思路
先创建一个 (m + 1) * (n + 1)
的二维数组 dp
,dp[i][j]
表示使用 i
个 0 和 j
个 1 时能选取的最大字符串数量。接着遍历字符串数组 strs
,对于每个字符串,统计其中 0 和 1 的数量。之后,从 m
到该字符串 0 的数量、n
到该字符串 1 的数量进行逆向遍历,更新 dp[i][j]
,取当前值和 dp[i - zeroNum][j - oneNum] + 1
中的较大值,dp[i - zeroNum][j - oneNum] + 1
表示选取当前字符串后的最大数量。最后返回 dp[m][n]。