代码随想录第36天 | 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

news2024/11/19 8:26:27

1049. 最后一块石头的重量

第一想法

/**
 * @param {number[]} stones
 * @return {number}
 */
var lastStoneWeightII = function (nums) {

    // 和分割两个和相等的子数组一样
    //dp[j]表示 背包总容量(所能装的总重量)是j,放进物品后,背的最大重量为dp[j]。
    //value[i]和weight[i] 数值
    // 结果,用来sum-dp[j]*2的最小值
    let sum = nums.reduce((x, y) => x + y)
    let dp = new Array(sum).fill(0);
    // 开始 01背包
    for (let i = 0; i < nums.length; i++) {
        for (let j = sum; j >= nums[i]; j--) { // 每一个元素一定是不可重复放入,所以从大到小遍历
            dp[j] = dp[j] > dp[j - nums[i]] + nums[i] ? dp[j] : dp[j - nums[i]] + nums[i]
        }
    }
    let i = 0
    let a = 100000000
    while (i < dp.length) {
        a = Math.abs(sum - dp[i] * 2) > a ? a : Math.abs(sum - dp[i] * 2)
        i++
    }
    return a
};


优化

不用算到最后面,就写到一般就好了

在这里插入图片描述
在这里插入图片描述

但js 中 n/a不会取整
用Math.floor(sum / 2);

/**
 * @param {number[]} stones
 * @return {number}
 */
var lastStoneWeightII = function(nums) {

 let sum=nums.reduce((x,y)=>x+y)
  let dpLen = Math.floor(sum / 2);
     let dp = new Array(dpLen+1).fill(0);
for(let i = 0; i < nums.length; i++) {
    for(let j = dpLen; j >= nums[i]; j--) { // 每一个元素一定是不可重复放入,所以从大到小遍历
        dp[j] = dp[j]> dp[j - nums[i]] + nums[i]? dp[j]:dp[j - nums[i]] + nums[i]
    }
}
return sum-dp[dpLen]*2
};

494. 目标和

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var findTargetSumWays = function(nums, target) {
  let sum=nums.reduce((x,y)=>x+y)
  if((sum+target)%2) return 0
  if(Math.abs(target)>sum) return 0
  const hf=(sum+target)/2
  let dp = new Array(hf+1).fill(0);
  dp[0]=1
  for (let i = 0; i < nums.length; i++) {
        for (let j =hf; j >= nums[i]; j--) { // 每一个元素一定是不可重复放入,所以从大到小遍历
         dp[j] += dp[j - nums[i]]
        }
    }
    return dp[hf]
};

第一想法

排列组合

困难

  • 问题转换

假设加法的总和为x,那么减法对应的总和就是sum - x。
所以我们要求的是 x - (sum - x) = target
x = (target + sum) / 2
此时问题就转化为,装满容量为x的背包,有几种方法。

  • dp[j] += dp[j - nums[i]]
    在这里插入图片描述

总结

  • dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
    一个限重的包装石头,石头有重量,有价值,怎样装最值钱
  • dp[j] += dp[j - nums[i]]
    dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法

一和零

const findMaxForm = (strs, m, n) => {
    const dp = Array.from(Array(m+1), () => Array(n+1).fill(0));
    let numOfZeros, numOfOnes;

    for(let str of strs) {
        numOfZeros = 0;
        numOfOnes = 0;
    
        for(let c of str) {
            if (c === '0') {
                numOfZeros++;
            } else {
                numOfOnes++;
            }
        }

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

    return dp[m][n];
};

思路

  1. dp[i][j]:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]。

  2. dp[i][j] 可以由前一个strs里的字符串推导出来,strs里的字符串有zeroNum个0,oneNum个1。
    dp[i][j] 就可以是 dp[i - zeroNum][j - oneNum] + 1。
    然后我们在遍历的过程中,取dp[i][j]的最大值。
    所以递推公式:dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);
    此时大家可以回想一下01背包的递推公式:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
    对比一下就会发现,字符串的zeroNum和oneNum相当于物品的重量(weight[i]),字符串本身的个数相当于物品的价值(value[i])。

这就是一个典型的01背包! 只不过物品的重量有了两个维度而已。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1064840.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JetBrains ToolBox修改应用安装位置

TooBox修改应用安装位置 1.关闭ToolBox 2.修改配置文件 找到配置文件所在位置 C:\Users\用户名\AppData\Local\JetBrains\Toolbox\.settings.json增加install_location字段 "install_location": "E:\\DevTool\\IDE",E:\DevTool\IDE可以改成自己想要的…

为什么MySQL索引选择B+树而不使用B树?

为什么mysql索引选择B树而不使用B树&#xff1f; 1. 关于mysql查询效率&#xff1a; 2. 关于分块读取&#xff1a; 3. 关于数据格式存储&#xff1a; 4. 关于合适的数据结构&#xff1a;哈希表&#xff0c;树 哈希表: 分析&#xff1a; 哈希表是散列表&#xff0c;存储在其中的…

基于腾讯云的OTA远程升级

一、OTA OTA即over the air,是一种远程固件升级技术&#xff0c;它允许在设备已经部署在现场运行时通过网络远程更新其固件或软件。OTA技术有许多优点&#xff0c;比如我们手机系统有个地方做了优化&#xff0c;使用OTA技术我们就不用召回每部手机&#xff0c;直接通过云端就可…

vim操作教程,看这一篇绝对足够啦~

简介 vi 是一种命令行的文本编辑器&#xff0c;vim 是进阶版的 vi&#xff0c;gvim是vim的图形化版本。 Vim有几种基本的工作模式&#xff1a; 一般模式&#xff08;Normal Mode, 命令模式&#xff0c;普通模式&#xff09; 一般模式是vim默认的模式&#xff0c;当打开一个…

基于springboot的论坛网站

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 普通管理员管理 交流论坛 交流论坛评论 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了…

前端项目nginx部署

进入nginx下载地址:https://nginx.org/ 下载完安装包以后,解压在D盘中 双击进去> 将前端打包好的文件放在nginx的html文件夹中 可能80端口会被系统所占用 我们可以在nginx的conf文件夹中的nginx.conf文件中修改80为90 之后我们就可以在任务管理器中看到了 然后 localhost:…

C++入门-day02

引言&#xff1a;在上一节中我们接触了C中的命名空间&#xff0c;学会了C中的标准输出流。这一节&#xff0c;我标题一们讲讲缺省、重载。 一、缺省参数 在C中&#xff0c;给函数的形参默认给一个值就是缺省参数&#xff0c;你可能会比较懵逼&#xff0c;下面看一段代码。 正常…

Prompt-Tuning(一)

一、预训练语言模型的发展过程 第一阶段的模型主要是基于自监督学习的训练目标&#xff0c;其中常见的目标包括掩码语言模型&#xff08;MLM&#xff09;和下一句预测&#xff08;NSP&#xff09;。这些模型采用了Transformer架构&#xff0c;并遵循了Pre-training和Fine-tuni…

项目规划得心应手:Plane 助你打造高效能团队 | 开源日报 No.48

streamlit/streamlit Stars: 27.5k License: Apache-2.0 Streamlit 是一个快速构建和共享数据应用程序的方法。它可以将数据脚本转换为可分享的 Web 应用&#xff0c;只需几分钟即可完成。该项目完全由 Python 编写&#xff0c;开源且免费&#xff01;一旦创建了一个应用程序&…

用IDEA操作数据库--MySQL

IDEA集成了DataGrip的操作数据库的功能 就可以省略我们下载SQLyog/Navicat/DataGrip这些图形化操作工具了 以下是IDEA的使用 输入数据库的用户和密码

c++系列之string的模拟实现

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; string() //注意事项&#xff1a; 1.初始化列表随声明的顺序进行初始化 2.cons…

nodejs+vue晨拾酒馆管理系统elementui

晨拾酒馆管理系统&#xff0c;主要的模块包括管理员&#xff1b;系统首页、个人中心、用户管理、图书分类管理、图书信息管理、图书借阅管理、图书归还管理、图书入库管理、热门图书管理、论坛管理、系统管理&#xff0c;用户&#xff1b;系统首页、个人中心、图书借阅管理、图…

TomCat关键技术

一、Tomcat 是什么 Tomcat 是一个 HTTP 服务器。通过前面的学习,我们知道HTTP 协议就是 HTTP 客户端和 HTTP 服务器之间的交互数据的格式,同时也通过 ajax 和 Java Socket 分别构造了 HTTP 客户端。HTTP 服务器我们也同样可以通过 Java Socket 来实现. 而 Tomcat 就是基于 J…

.net framework中webapi使用swagger进行接口文档展示

第一步&#xff1a;在nuget程序包管理中搜索“Swashbuckle”包&#xff0c;然后进行安装&#xff08;注&#xff1a;如果是.net core api请安装Sawshbuckle aspnetcore&#xff09;。 第二步&#xff1a;打开项目App_Start文件夹&#xff0c;修改SwaggerConfig.cs配置文件 我这…

CSS3实现动画加载效果

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>加载效果</title><link rel"style…

R语言通过接口获取网上数据平台的免费数据

大家好&#xff0c;我是带我去滑雪&#xff01; 作为一名统计学专业的学生&#xff0c;时常和数据打交道&#xff0c;我深知数据的重要性。数据是实证研究的重要基础&#xff0c;每当在完成一篇科研论文中的实证研究部分时&#xff0c;我都能深刻体会实证研究最复杂、最耗时的工…

ubuntu配置vscode c++环境

下载vscode deb安装包 Get Started with C on Linux in Visual Studio Code 1. 安装vscode sudo dpkg -i code_1.83.0-1696350811_amd64.deb 2. 确保gcc编译器已经安装 g --version 如果没有安装&#xff0c;执行以下命令安装 sudo apt-get update sudo apt-get install …

数字IC前端学习笔记:数字乘法器的优化设计(华莱士树乘法器)

相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 进位保留乘法器依旧保留着阵列的排列规则&#xff0c;只是进位是沿斜下角&#xff0c;如果能使用树形结构来规划这些进位保留加法器&#xff0c;就能获得更短的关键…

Postman接口测试学习之常用断言

什么是断言&#xff1f; 断言——就是结果中的特定属性或值与预期做对比&#xff0c;如果一致&#xff0c;则用例通过&#xff0c;如果不一致&#xff0c;断言失败&#xff0c;用例失败。断言&#xff0c;是一个完整测试用例所不可或缺的一部分&#xff0c;没有断言的测试用例…