代码随想录算法训练营第四十五天| 1049. 最后一块石头的重量 II、494. 目标和、474.一和零

 1049. 最后一块石头的重量 II

题目链接:1049. 最后一块石头的重量 II

文档讲解:代码随想录/最后一块石头的重量 II

视频讲解:视频讲解-最后一块石头的重量 II

状态:已完成(1遍)

解题过程 

这几天属实是有点分身乏术了,先直接看题解AC了,二刷的时候再来补上自己的思路和尝试吧。

看完代码随想录之后的想法 

用动态规划五部曲:

  1. 确定dp数组以及下标的含义:dp[j]表示容量(这里说容量更形象,其实就是重量)为j的背包,最多可以背最大重量为dp[j];
  2. 确定递推公式:dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);
  3. 代码初始化如下:因为重量都不会是负数,所以dp[j]都初始化为0就可以了,这样在递归公式dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);中dp[j]才不会初始值所覆盖;

  4. 确定遍历顺序:如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历;
  5. 举例推导dp数组:

讲解代码如下:

/*** @param {number[]} stones* @return {number}*/
var lastStoneWeightII = function (stones) {let sum = stones.reduce((s, n) => s + n);let dpLen = Math.floor(sum / 2);let dp = new Array(dpLen + 1).fill(0);for (let i = 0; i < stones.length; ++i) {for (let j = dpLen; j >= stones[i]; --j) {dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]);}}return sum - dp[dpLen] - dp[dpLen];
};


 494. 目标和

题目链接:494. 目标和

文档讲解:代码随想录/目标和

视频讲解:视频讲解-目标和

状态:已完成(1遍)

解题过程  

 看完代码随想录之后的想法 

用动态规划五部曲:

  1. 确定dp数组以及下标的含义:填满j(包括j)这么大容积的包,有dp[j]种方法
  2. 确定递推公式:
    dp[j] += dp[j - nums[i]]
  3. 代码初始化如下:

    从递推公式可以看出,在初始化的时候dp[0] 一定要初始化为1,因为dp[0]是在公式中一切递推结果的起源,如果dp[0]是0的话,递推结果将都是0。

    这里有录友可能认为从dp数组定义来说 dp[0] 应该是0,也有录友认为dp[0]应该是1。

    其实不要硬去解释它的含义,咱就把 dp[0]的情况带入本题看看应该等于多少。

    如果数组[0] ,target = 0,那么 bagSize = (target + sum) / 2 = 0。 dp[0]也应该是1, 也就是说给数组里的元素 0 前面无论放加法还是减法,都是 1 种方法。

    所以本题我们应该初始化 dp[0] 为 1。

    可能有同学想了,那 如果是 数组[0,0,0,0,0] target = 0 呢。

    其实 此时最终的dp[0] = 32,也就是这五个零 子集的所有组合情况,但此dp[0]非彼dp[0],dp[0]能算出32,其基础是因为dp[0] = 1 累加起来的。

    dp[j]其他下标对应的数值也应该初始化为0,从递推公式也可以看出,dp[j]要保证是0的初始值,才能正确的由dp[j - nums[i]]推导出来。

  4. 确定遍历顺序:

    nums放在外循环,target在内循环,且内循环倒序

  5. 举例推导dp数组

讲解代码如下:

const findTargetSumWays = (nums, target) => {const sum = nums.reduce((a, b) => a+b);if(Math.abs(target) > sum) {return 0;}if((target + sum) % 2) {return 0;}const halfSum = (target + sum) / 2;let dp = new Array(halfSum+1).fill(0);dp[0] = 1;for(let i = 0; i < nums.length; i++) {for(let j = halfSum; j >= nums[i]; j--) {dp[j] += dp[j - nums[i]];}}return dp[halfSum];
};


474.一和零

题目链接:474.一和零

文档讲解:代码随想录/一和零

视频讲解:视频讲解-一和零

状态:已完成(1遍)

解题过程  

看完代码随想录之后的想法 

用动态规划五部曲:

  1. 确定dp数组以及下标的含义:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]
  2. 确定递推公式:dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);
  3. dp数组如何初始化:

    01背包的dp数组初始化为0就可以。

    因为物品价值不会是负数,初始为0,保证递推的时候dp[i][j]不会被初始值覆盖;

  4. 确定遍历顺序:外层for循环遍历物品,内层for循环遍历背包容量且从后向前遍历;
  5. 举例推导dp数组:

    按照这个递推公式我们来推导一下,dp数组应该是如下的数列: 10 15 30  。

讲解代码如下:

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];
};

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

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

相关文章

深入解析CRM客户关系系统:技术架构与功能实现的融合创新

CRM客户关系管理系统&#xff08;Customer Relationship Management System&#xff09;是一种以客户为中心的信息系统&#xff0c;旨在帮助企业更好地管理和维护客户关系&#xff0c;提高客户满意度和忠诚度&#xff0c;从而提升企业的市场竞争力。以下是CRM客户关系管理系统的…

Python父子继承

下列代码输出是&#xff1a; python class Parent: def __init__(self)&#xff1a; self.value4 def get_value(self)&#xff1a; return self.value class Child(Parent): def get_value(self)&#xff1a; return self.value1…

Lua与Python:深度解析两者之间的核心差异

Lua与Python&#xff1a;深度解析两者之间的核心差异 在计算机编程的广袤领域中&#xff0c;Lua和Python作为两种具有独特特性和应用领域的语言&#xff0c;各自闪耀着独特的光芒。然而&#xff0c;尽管它们都是编程语言&#xff0c;但Lua和Python在多个方面存在着显著的差异。…

深度学习和计算机视觉中的backbone

在深度学习和计算机视觉中&#xff0c;“backbone” 是指深度神经网络的主要部分&#xff0c;通常用于特征提取。骨干网络通过卷积操作提取图像中的低级和高级特征&#xff0c;为后续的特定任务&#xff08;如分类、检测、分割等&#xff09;提供丰富的信息。这些骨干网络一般是…

电磁兼容整改时磁环怎么选型

电磁兼容整改时磁环怎么选型 磁环的选型错误磁环特性纳米微晶磁环磁环选型示例磁环选型 一条线缆两端都有设备&#xff0c;那磁环应该放在哪里&#xff1f; 我们怎么样来选择这个磁环&#xff0c;通过磁环的吸收作用&#xff0c;让辐射的强度和传导发射的这个强度衰减更大的那我…

OLED C语言编程:深度解析与实战应用

OLED C语言编程&#xff1a;深度解析与实战应用 OLED显示技术以其出色的显示效果和低功耗特性&#xff0c;在现代电子设备中得到了广泛应用。而C语言作为一种高效、灵活的编程语言&#xff0c;自然成为OLED编程的首选。本文将从四个方面、五个方面、六个方面和七个方面&#x…

Linux|虚拟机|Windows 11 家庭版的Hyper虚拟机服务开启

前言&#xff1a; Windows11的版本是比较多的&#xff0c;但有的时候笔记本预装的可能是家庭版&#xff0c;而家庭版的Windows通常是不支持虚拟机的&#xff0c;也就是说Hyper服务根本就看不到 Windows的程序和功能大体如下&#xff1a; &#x1f197;&#xff0c;那么如何开…

最近关于工作与学习的一点思考

文章目录 关于工作关于学习职业规划 关于工作 我2015年大学毕业&#xff0c;工作到现在&#xff0c;差不多九个年头了。最近换工作&#xff0c;有一些沉淀的想法&#xff0c;分享一下我是在淮南读的大学&#xff0c;毕业后就到合肥工作了&#xff0c;直到现在。回过头看&#…

一、初识Qt 之 Hello world

一、初识Qt 之 Hello world 提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 初识Qt 之 Hello world文章目录 一、Qt 简介二、Qt 获取安装三、Qt 初步使用四、Qt 之 Hello world1.新建一个项目 总结 一、Qt 简介 C &#xf…

数据库系统概论(超详解!!!)第十节 过程化SQL

1.Transact-SQL概述 SQL(Structure Query Language的简称&#xff0c;即结构化查询语言) 是被国际标准化组织(ISO)采纳的标准数据库语言&#xff0c;目前所有关系数据库管理系统都以SQL作为核心&#xff0c;在JAVA、VC、VB、Delphi等程序设计语言中也可使用SQL&#xff0c;它是…

重生之我想写后端

Vue Element Plus 简单的响应式侧边栏 利用onMounted&#xff0c;初次加载页面的时候&#xff0c;为页面注册一个监听器。 当 ‘resize’ 事件发生时&#xff0c; 触发函数。 此函数里监听窗口大小&#xff0c;当窗口小于 500px 时&#xff0c;改变 isCollpase boolean 值。 …

利用元宇宙NFG+IPO线上营销,打造新商业模型

随着互联网技术的飞速发展&#xff0c;商业模式和创新方式层出不穷。特别是在移动电商和区块链技术的双重推动下&#xff0c;市场格局正在经历一场深刻的变革。然而&#xff0c;随着竞争加剧和监管收紧&#xff0c;如何构建一个既能吸引用户又能保持系统稳定的商业模型&#xf…

Chapter 5 Current Mirrors and Biasing Techniques

Chapter 5 Current Mirrors and Biasing Techniques 这一章介绍电流镜 5.1 Basic Current Mirrors MOS工作在饱和区, 表现为一个电流源. 考虑电源变化, PVT波动, 我们会首先产生一路精准电流源, 再复制这路电流. 如何复制呢? 电流转电压再转电流就行了, 如下图所示 考虑到…

Kivy.uix.textinput

一个小小的输入框&#xff0c;纵上下数页文档已不能全不概括&#xff0c;当去源码慢慢寻找&#xff0c;才知道其中作用&#xff0c;才能运用灵活。 Text Input — Kivy 2.3.0 documentation # -*- encoding: utf-8 -*-Text Input .. versionadded:: 1.0.4.. image:: images/te…

windows安装nodeJs,以及常用操作

1. 官网(Node.js — Run JavaScript Everywhere (nodejs.org))下载想要安装的node版本 的安装包完成安装 2.环境变量设置&#xff1a; 系统变量&#xff1a; Path新增&#xff1a;D:\Program Files\nodejs (node安装目录) 3.设置淘宝源&#xff1a; npm config set registr…

传感器和变送器的区别介绍

从它的名称来看&#xff0c;传与感二字。传是指传输&#xff0c;感是指感知。实际上是先有感知&#xff0c;其次转换&#xff0c;最后传输。因此传输是目的&#xff0c;转换是手段&#xff0c;感知是基础。把能够将被测变量&#xff08;温度、压力、液位、流量&#xff09;感知…

Python操作系统交互的15个实用命令

对于Python初学者而言&#xff0c;掌握如何使用Python与操作系统进行交互是一项非常实用的技能。这不仅能够让你的脚本更加灵活强大&#xff0c;还能在自动化任务处理、文件管理等方面大显身手。下面&#xff0c;我们将通过10个简单到复杂的实例&#xff0c;逐步引导你学习如何…

港湾周评|李小加“刀刃向内”裁员

《港湾商业观察》李镭 近年来争议颇大的滴灌通风波不断。 在交100万付费上班不久&#xff0c;最新又被曝出裁员。这位前港交所总裁、金融圈鼎鼎大名的李小加&#xff0c;没想到成立不足三年便迎来了重大挑战。 日前&#xff0c;滴灌通确认了公司组织架构已经调整&#xff0c…

Flutter 中的 SliderTheme 小部件:全面指南

Flutter 中的 SliderTheme 小部件&#xff1a;全面指南 Flutter 是一个创新的 UI 工具包&#xff0c;它允许开发者通过 Dart 语言来创建美观、高效的移动和 Web 应用。在 Flutter 的交互组件中&#xff0c;滑块&#xff08;Slider&#xff09;是一种常用的控件&#xff0c;用于…

【教程】如何实现WordPress网站降级(用于解决插件和主题问题)

在最新可用版本上运行WordPress安装、插件和主题是使用该平台的关键最佳实践。还建议使用最新版本的PHP。但是,在某些情况下,这是不谨慎或不可能的。 如果您发现自己处于这种情况,您可能需要撤消更新并降级您的WordPress网站(或其中的一部分)。幸运的是,有一些方法可用于…