1.分割等和子集
题目:
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
注意:
每个数组中的元素不会超过 100
数组的大小不会超过 200
思路:分割成等和数组,其实就是找到一个子数组,和为sum/2.这就很像背包问题了。,所以用动态规划
先判断整个数组的和,奇数肯定不可以。然后初始化dp,是一个target(sum/2)*n的矩阵,表示第[i,j]个元素表示0-i个元素内是否存在子数组使得和为j
时间复杂度O(nt),空间复杂度O(nt),n是数组长度,t是数组和
/**
* @param {number[]} nums
* @return {boolean}
*/
var canPartition = function(nums) {
const n = nums.length;
if (n < 2) {
return false;
}
let sum = 0, maxNum = 0;
for (const num of nums) {
sum += num;
maxNum = maxNum > num ? maxNum : num;
}
if (sum % 2) {
return false;
}
const target = sum / 2;
if (maxNum > target) {
return false;
}
const dp = new Array(n).fill(0).map(() => new Array(target + 1).fill(false));
for (let i = 0; i < n; i++) {
dp[i][0] = true;
}
dp[0][nums[0]] = true;
for (let i = 1; i < n; i++) {
const num = nums[i];
for (let j = 1; j <= target; j++) {
if (j >= num) {
dp[i][j] = dp[i - 1][j] || dp[i - 1][j - num];
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
return dp[n - 1][target];
};
2.太平洋大西洋水流问题
timu :
给定一个 m x n
的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。
规定水流只能按照上、下、左、右四个方向流动,且只能从