689. 三个无重叠子数组的最大和
413. 等差数列划分
446. 等差数列划分 II - 子序列
368. 最大整除子集
416. 分割等和子集
思路
转换成完全背包问题,利用动态规划来做
代码
/**
* @param {number[]} nums
* @return {boolean}
*/
var canPartition = function(nums) {
// 先求和
let sum = nums.reduce((total, cur) => total + cur, 0);
// 如果为奇数直接返回
if (sum % 2) return false;
// 得到目标值
let target = sum / 2, len = nums.length;
// 初始化dp数组的值
let dp = Array(len).fill(0).map(item => Array(target+1).fill(false))
// 第一排只能填满自己
dp[0][nums[0]] = true;
for(let i = 1; i < nums.length; i ++) {
for(let j = 0; j <= target; j ++) {
// 先把上一排的抄下来再做处理
dp[i][j] = dp[i-1][j];
// 如果恰巧为当前值,那么可以填满自己
if (nums[i] === j) {
dp[i][j] = true;
continue;
}
// 如果小于当前值,看上一排的位置中能满足不
if (nums[i] < j) {
dp[i][j] = dp[i-1][j] || dp[i-1][j - nums[i]]
}
}
}
return dp[len-1][target];
};
复杂度分析
时间复杂度 #card=math&code=O%28N%20%2A%20sum%29)
空间复杂度 #card=math&code=O%28N%20%2A%20sum%29)