程式碼隨想錄演算法訓練營第42天 | 1049. 最後一塊石頭的重量 II 、494. 目標和 、474.一和零

YuanYF6發表於2024-06-19
  1. 最後一塊石頭的重量 II

本題就和 昨天的 416. 分割等和子集 很像了,可以嘗試先自己思考做一做。
影片講解:https://www.bilibili.com/video/BV14M411C7oV
https://programmercarl.com/1049.最後一塊石頭的重量II.html

這三體=題都沒啥思路
/**
 * @param {number[]} stones
 * @return {number}
 */
var lastStoneWeightII = function(stones) {
    let sum = 0;
    for (let i=0;i<stones.length;i++) {
        sum+=stones[i];
    }
    let target = Math.floor(sum/2);

    const dp = new Array(target+1).fill(0);
    for (let i=0;i<stones.length;i++) {
        for (let j=target;j>=stones[i];j--) {
            dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]);
        }
    }
    return sum-dp[target] - dp[target];
};
  1. 目標和
    大家重點理解 遞推公式:dp[j] += dp[j - nums[i]],這個公式後面的提問 我們還會用到。
    影片講解:https://www.bilibili.com/video/BV1o8411j73x
    https://programmercarl.com/0494.目標和.html
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var findTargetSumWays = function(nums, target) {
    let sum = 0;
    for (let i=0;i<nums.length;i++) {
        sum+=nums[i];
    }
    if (Math.abs(target)>sum) {
        return 0;
    }
    if ((sum+target)%2===1) {
        return 0;
    }

    let left = (sum+target)/2;

    const dp = new Array(left+1).fill(0);
    dp[0] = 1;

    for (let i=0;i<nums.length;i++) {
        for (let j=left;j>=nums[i];j--) {
            dp[j] += dp[j-nums[i]];
        }
    }
    return dp[left];
};

474.一和零
透過這道題目,大家先粗略瞭解, 01揹包,完全揹包,多重揹包的區別,不過不用細扣,因為後面 對於 完全揹包,多重揹包 還有單獨講解。
影片講解:https://www.bilibili.com/video/BV1rW4y1x7ZQ
https://programmercarl.com/0474.一和零.html

/**
 * @param {string[]} strs
 * @param {number} m
 * @param {number} n
 * @return {number}
 */
var findMaxForm = function(strs, m, n) {
    const dp = new Array(m+1).fill(0).map(()=>new Array(n+1).fill(0));
    for (let str of strs) {
        let x = 0;
        let y = 0;
        for (let k=0;k<str.length;k++) {
            if (str[k] === '0'){
                x++;
            } else {
                y++;
            }
        }

        for (let i=m;i>=x;i--) {
            for(let j=n;j>=y;j--) {
                dp[i][j] = Math.max(dp[i][j], dp[i-x][j-y]+1);
            }
        }
    }
    return dp[m][n];
};

相關文章