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)
