js解leetcode(31)-中等

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 的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。

规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。

请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。

 

提示:

  1. 输出坐标的顺序不重要
  2. <

你可能感兴趣的:(分割等和子集,太平洋大西洋水流问题,甲板上的战舰,数组中两个数的最大异或值,从英文中重建数字)