代码随想录算法训练营第四十三天| LeetCode1049. 最后一块石头的重量 II、LeetCode494. 目标和、LeetCode474. 一和零

news2024/11/23 15:28:05

一、LeetCode1049. 最后一块石头的重量 II

        1:题目描述(1049. 最后一块石头的重量 II)

        有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。

        每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:

  • 如果 x == y,那么两块石头都会被完全粉碎;
  • 如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x

        最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0

        2:解题思路

class Solution:
    def lastStoneWeightII(self, stones: List[int]) -> int:
        # 将一堆石头分成两堆重量相近的两堆石头,这样两堆石头碰撞之后,得到的重量就是最小重量
        # 如何获得两堆重量相近的石头呢?
        # 把这一堆石头的重量,除以2,向下取整,就是其中一堆石头的重量
        # 另外一堆石头的重量就是原石头总重量-向下取整得到的石头重量
        # 然后我们就可以把向下取整得到的石头重量,看做背包容量,石头的重量看做物品的重量和价值
        # 就将这个问题转化成了0-1背包问题,就可以用01背包的思路来进行求解

        # 
        target = sum(stones) // 2          # 求石头总重量的一半,向下取整
        # 定义dp数组,dp[j]表示,容量为j的背包得到的最大价值为dp[j]
        # 初始化,j=0时,无法装物品,所以dp[0]=0
        # 其他的是求上一个容量所装的最大价值和上一个容量所装的最大价值+当前物品重量的最大值,所以其他元素也初始化为0
        dp = [0] * (target+1)        # 防止元素溢出,长度为target+1
        # 遍历顺序,先遍历物品,再倒序遍历背包容量(防止同一个物品重复加入)
        for i in range(len(stones)):
            # j从target开始,从后向前遍历,直到j>=sones[i]
            for j in range(target, stones[i]-1, -1):  
                # 递推公式,0-1背包的递推公式为:dp[j] = max(dp[j], dp[j-weight[i]]+value[i])
                # 本题中石头的重量就是石头的价值,所以dp[j] = max(dp[j], dp[j-stones[i]]+stones[i])
                dp[j] = max(dp[j], dp[j-stones[i]]+stones[i])
        # dp[target]是容量为target的背包所能装的最大价值,及石头的最大重量
        # sum(stones)-dp[target]是,剩余的石头重量
        res = sum(stones)-dp[target] - dp[target]    # res就是两堆石头碰撞之后,所剩的最小重量
        return res

二、LeetCode494. 目标和

        1:题目描述(494. 目标和)

        给你一个整数数组 nums 和一个整数 target 。

        向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 :

  • 例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。

        返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。

        2:解题思路

        确定dp数据的含义:

        dp[j]表示,装满容量为j的背包有dp[j]种方式

        递推公式:

        不考虑nums[i]的情况下,填满容量为j的背包,有dp[j]种方法。

        那么考虑nums[i]的话(只要搞到nums[i]),凑成dp[j]就有dp[j - nums[i]] 种方法。

        例如:dp[j],j 为5,

  • 已经有一个1(nums[i]) 的话,有 dp[4]种方法 凑成 dp[5]。
  • 已经有一个2(nums[i]) 的话,有 dp[3]种方法 凑成 dp[5]。
  • 已经有一个3(nums[i]) 的话,有 dp[2]中方法 凑成 dp[5]
  • 已经有一个4(nums[i]) 的话,有 dp[1]中方法 凑成 dp[5]
  • 已经有一个5 (nums[i])的话,有 dp[0]中方法 凑成 dp[5]

        那么凑整dp[5]有多少方法呢,也就是把 所有的 dp[j - nums[i]] 累加起来。

        所以递推公式为:dp[j] += dp[j - nums[i]](求组合类问题的公式,都类似于这种)

class Solution:
    def findTargetSumWays(self, nums: List[int], target: int) -> int:
        # 将nums分为两个数组,一个数组放正数(left),一个数组放负数(right)
        # 由题意得出:
        # sun(left) + sum(right) = sum(nums)
        # sum(left) - sum(right) = target
        # 可得出:sun(left) - (sum(nums)-sum(left)) = target,sum(left) = (target+sum(nums))/2
        # 即正数数组left中,有多少种方式,可以使得sum(left) = (target+sum(nums))/2
        # 由此可看做0-1背包问题
        # 定义:dp[j]表示,装满容量为j的背包有dp[j]种方式
        # 初始化:j=0时,dp[0] = 1
        # 递推公式:dp[j] += dp[j-nums[i]]
        # 遍历顺序,先遍历物品,再倒序遍历背包容量,直到背包容量小于物品重量
        if abs(target) > sum(nums) or (target+sum(nums))%2 != 0:
            # 如果正数数组的和不能被2整除的话,说明找不到符合题意的组合
            # 若目标值的绝对值已经大于了nums的元素和,说明没有符合题意的组合
            return 0          
        left = int((target+sum(nums))/2)       # 正数数组的和
        dp = [0] * (left+1)
        dp[0] = 1
        for i in range(len(nums)):
            for j in range(left, nums[i]-1, -1):
                dp[j] += dp[j-nums[i]]
        return dp[left]

三、LeetCode474. 一和零

        1:题目描述(474. 一和零)

        给你一个二进制字符串数组 strs 和两个整数 m 和 n 。

        请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。

        如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。

        2:解题思路

        确定dp数组含义:

        定义dp[i][j],表示装满i个0,j个1,最多有dp]i[j]个物品;即最多有i个0和j个1的strs的最大子集的大小为dp[i][j]

        递推公式:

        dp[i][j] 可以由前一个strs里的字符串推导出来,strs里的字符串有x个0,y个1。

        dp[i][j] 就可以是 dp[i - x][j - y] + 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]);

        字符串的x和y相当于物品的重量(weight[i]),字符串本身的个数相当于物品的价值(value[i])。 只不过物品的重量有了两个维度而已。

class Solution:
    def findMaxForm(self, strs: List[str], m: int, n: int) -> int:
        # 看做0-1背包问题,背包容量是m个0,n个1
        # 定义dp[i][j],表示装满i个0,j个1,最多有dp]i[j]个物品;即最多有i个0和j个1的strs的最大子集的大小为dp[i][j]
        # 递推公式:dp[i][j] = max(dp[i][j], dp[i-x][j-y]+1),x表示当前物品有x个0,y个1
        # 初始化:当i=0,j=0,初始化为0,即dp[0][0] = 0,其他元素也初始化为0
        # 遍历顺序,先遍历字符串(物品),即strs,统计物品中有x个0,y个1
        # 再倒序遍历m,n

        dp = [[0] * (n + 1) for _ in range(m + 1)]
        for s in strs:           # 遍历字符串
            x, y = 0, 0
            for item in s:
                # 统计字符串中,0和1的个数
                if item == "0": x += 1
                else: y += 1
            for i in range(m, x-1, -1):     # 倒序遍历0的个数,1的个数
                for j in range(n, y-1, -1):
                    dp[i][j] = max(dp[i][j], dp[i-x][j-y]+1)
        return dp[m][n]

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

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

相关文章

让你快速高效的掌握linux内核编译过程

Linux内核编译 一、linux内核的配置与编译&#xff1a; 1.配置内核 1)导入默认配置&#xff1a; make xxxx_defconfig 注1&#xff1a;xxxx表示内核支持的芯片的名称 比如make exynos_defconfig 注2&#xff1a;内核源码中对每个支持的芯片都有默认的配置&#xff0c;默认配置很…

【博学谷学习记录】超强总结,用心分享|架构师-RabbitMQ消息可靠性保障

文章目录一、生产者保证1.1 失败通知1.2 发送方确认1.3 Broker丢失消息二、消费方消息可靠性2.1 消费者手动确认消息依靠三个对象&#xff1a;生产者、消费者、broker一、生产者保证 生产者发送消息到broker时&#xff0c;要保证消息的可靠性&#xff0c;主要的方案有&#xf…

5.28 综合案例2.0-简易起夜灯

HaaS506 - 简易起夜灯简介准备硬件连接图功能实现1.继电器使用说明2. 5.8G雷达感应传感器模块说明3.简易代码3.1测试log简介 案例为了解决晚上起床找不到灯的问题。当你从床上起来时&#xff0c;雷达感应传感器检测到你的活动后自动打开电灯。省去了寻找电灯开关的麻烦。 准备…

java学习笔记 day07-Java基础-综合练习

练习一&#xff1a;飞机票 需求: ​ 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 ​ 按照如下规则计算机票价格&#xff1a;旺季&#xff08;5-10月&#xff09;头等舱9折&#xff0c;经济舱8.5折&#xff0c;淡季&#xff08;11月到来…

表白墙(web版)

文章目录前言一、需求分析1.表白墙页面设计2.表白墙功能二、实现1.客户端2.服务器端3.连接数据库前言 前面前端部分写过一个表白墙页面&#xff0c;但是它不能存储提交信息&#xff0c;为了能够让它在提交信息后可以保存其信息&#xff0c;页面刷新后信息依然存在&#xff0c;…

itk配准整理(1)

示例地址&#xff1a; itk\ITK\Examples\RegistrationITKv4\ImageRegistration7.cxx 说明&#xff1a;itk二维图像的配准&#xff1a;平移旋转缩放 效果图&#xff1a; 运行结果&#xff1a; 52 53.6213 [0.8333298229719548, -0.17450270771316403, -12.806452097490313, -1…

在Win10中使用YAMAHA S-YXG50软波表

曾经非常经典的一款软波表YAMAHA S-YXG50我个人非常的喜欢。在XP系统的时代&#xff0c;是我必装的软件&#xff0c;用来听一些MIDI音质和效果很好。而如今玩MIDI的人越来越少了&#xff0c;软波表的时代也被人渐渐的遗忘了。 如今想要怀旧的话&#xff0c;只能够找一台老电脑…

LINUX的XEN和KVM到底区别在什么地方?

本文调研的是 Completely Fair Scheduler 算法, 它当前是 Linux 中 SCHED_NORMAL(非实时任务) 一类 task 的默认调度器. 实际上, 运行在 Guest OS 中的应用程序线程还受到 Guest OS 的调度, 分时运行在 vCPU 上, 但这不在本文调研范围内. 本文仅调研 vCPU 被如何调度到 pCPU 上…

WebDAV之葫芦儿·派盘+无聊笔记

无聊笔记 支持webdav方式连接葫芦儿派盘。 无聊笔记是一款深受用户认可的系统工具,随时都可以进行软件的操作,也可以在线进行笔记的记录,系统会进行智能的保存,满足了用户日常中的需求,可以把软件作为备忘录,笔记本,摘抄录等。 无聊笔记是一个功能强大的记录工具,您…

代码随想录算法训练营第四十二天| LeetCode416. 分割等和子集

一、LeetCode416. 分割等和子集 1&#xff1a;题目描述&#xff08;416. 分割等和子集&#xff09; 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 2&#xff1a;解题思路 本题需要使用01背包的…

合作动态 | 方正璞华与日立签订战略合作协议,加快推进数字化管理变革!

2022年10月27日&#xff0c;方正璞华PLM事业部负责人王志起先生与日立方代表正式签订“方正璞华PLM产品销售合作框架协议”。 根据协议&#xff0c;双方将围绕璞华PLM产品推广、客户拓展、全生命周期运营服务等领域&#xff0c;开展多元化、多层级的深度融合合作&#xff0c;共…

HTML制作一个介绍自己家乡的网站——贵阳,排版整洁,内容丰富,主题鲜明

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

CV:计算机视觉技最强学习路线之CV简介(传统视觉技术/相关概念)、早期/中期/近期应用领域(偏具体应用)、经典CNN架构(偏具体算法)概述、常用工具/库/框架/产品、环境安装、常用数据集、编程技巧

CV&#xff1a;计算机视觉技最强学习路线之CV简介(传统视觉技术/相关概念)、早期/中期/近期应用领域(偏具体应用)、经典CNN架构(偏具体算法)概述、常用工具/库/框架/产品、环境安装、常用数据集、编程技巧 导读&#xff1a;计算机视觉技最强学习路线&#xff0c;博主花了三个晚…

Class加载过程

文章目录java解释执行热点代码编译类生命周期加载&#xff08;Loading&#xff09;验证&#xff08;Verification&#xff09;准备&#xff08;Preparation&#xff09;解析&#xff08;Resolution&#xff09;初始化&#xff08;Initialization&#xff09;使用&#xff08;Us…

并发编程(三)原子性(2)

【 悲观锁与乐观锁 】&#xff1a; 【悲观锁】&#xff1a; 一定会被别人打断&#xff1b;我必须得上锁。synchronized就是悲观锁。 【乐观锁】&#xff1a; 乐观锁又称之为——无锁、自旋锁、CAS 。 厕所里的人认为不会有其他人来上厕所和我竞争。 【举例解释CAS操作】&a…

SOHO帮客户找新品,如何拿到最优价?要不要选择大型机械类产品?

做外贸&#xff0c;无论是贸易公司还是工厂&#xff0c;又或者是SOHO。都有机会帮助客户采购自己主打产品之外的其他产品&#xff0c;有些人就会问&#xff0c;对于客户咨询的新产品&#xff0c;我们本身没有熟悉的供应商&#xff0c;这个时候要怎么去找到好的供货商&#xff1…

世界技能大赛夺冠背后,亚马逊云科技如何培养云计算技能人才?

云计算相关专业的就业前景如何&#xff1f; 人社部数据显示&#xff0c;到2025年我国云计算人才缺口将高达近150万。另一方面&#xff0c;根据艾瑞咨询《中国云计算行业洞察与人才分析》报告&#xff0c;2019年云计算领域人才月均薪酬在1万元以上的占比达93.7%&#xff0c;3万元…

VK3606D抗电机马达干扰直接输出6键触摸芯片,电容式6通道触控检测IC低电平有效,无触摸4秒进入待机模式常用于工控面板/空调/风扇/家电等

VINKA/永嘉微电的VK3606D SOP16是一种具有自动校准功能&#xff0c;低待机电流&#xff0c;抗电压波动等特性的&#xff0c;6按键电容式触摸触控检测IC&#xff0c;适用于温控器&#xff0c;86面板触摸开关&#xff0c;智能家居等抗干扰场所 型号&#xff1a;VK3606D 封装形…

WebGL、GPU硬件加速、GLSL、光栅化

一、介绍 WebGL经常被当成3D API&#xff0c;人们总想“我可以使用WebGL和一些神奇的东西做出炫酷的3D作品”。 事实上WebGL仅仅是一个光栅化引擎&#xff0c;它可以根据你的代码绘制出点&#xff0c;线和三角形。 想要利用WebGL完成更复杂任务&#xff0c;取决于你能否提供合…

CentOS Stream 9 配置静态 IP

系统环境&#xff1a; OS&#xff1a;CentOS Stream 9 CentOS Stream 9 不同于以往版本的 CentOS&#xff0c;没有之前的网络设置相关的命令&#xff0c;如&#xff1a; service network start/restart/status systemctl start/restart/status network设置网卡 IP 的配置文件…