当前位置: 首页 > news >正文

力扣474-一和零(Java详细题解)

题目链接:474. 一和零 - 力扣(LeetCode)

前情提要:

因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。

最近刚学完01背包,所以现在的题解都是以01背包问题为基础再来写的。

如果大家不懂01背包的话,建议可以去学一学,01背包问题可以说是背包问题的基础。

如果大家感兴趣,我后期可以出一篇专门讲解01背包问题。

dp五部曲。

1.确定dp数组和i下标的含义。

2.确定递推公式。

3.dp初始化。

4.确定dp的遍历顺序。

5.如果没有ac打印dp数组 利于debug。

每一个dp题目如果都用这五步分析清楚,那么这道题就能解出来了。

题目思路:

本题要求的是m个0n个1时子集中的最大长度。

其实这m个0n个1就是一种容器,我们要将该容器装满,求得子集的最大长度即可。

那么可以将这种容器抽象为背包,只不过这个背包是二维的,最大容量为m个0,n个1。

那么问题可以转化为将这个背包装满,求物品的数量。

接下来我们用动规五部曲来系统分析一下。

1.确定dp数组和i下标的含义。

我们这个背包是二维的,所以我们的dp数组也得是二维的。

dp[i] [j]指有i个0m个1时最大能装的物品数量。

2.确定递推公式。

首先我们来看看纯01背包问题的递推公式。

dp[j] = Math.max(dp[j],dp[j - weight[i]] + value[i]);

那么本题的递推公式其实和01背包递推公式相似。

每个物品只有选和不选俩种状态。

不选的话就是dp[i] [j]因为没有选该物品,所以背包容量不变。

选的话就是dp[i - x] [j - y] + 1;其实x表示的是当前物品0的数量,y表示当前物品1的数量。

因为选的话,就得求出加入当前物品之前的背包容量能装入的最大物品数量,再加上该物品。也就是 + 1;

所以我们的递推公式就是 dp[i] [j] = Math.max(dp[i] [j],dp [i - x] [j - y] + 1);

3.dp初始化。

dp[0] [0]指的就是当背包中有0个0和0个1时能装入的物品数量,所以dp[0] [0] = 0;

其他的非0下标可以通过dp数组推出来,所以其他的我们就不初始化,没有意义。

4.确定dp的遍历顺序。

该题与01背包的遍历顺序相同,物品从前往后遍历,背包容量从后往前遍历上为了保证每个物品只放入了一次。

5.如果没有ac打印dp数组 利于debug。

如果没有出现差错,我们就可以不用打印,因为我是写题解,所以我就不添加核心代码以外的代码,不然代码显的有些冗余。

举个例子。

在这里插入图片描述

最终代码:

class Solution {public int findMaxForm(String[] strs, int m, int n) {// 本题核心思路就是把这个背包装满,最多能装多少物品。//同时本题背包具有俩个维度。//递推公式 dp[i][j]是指在i个0j个1下能装满的物品数量。//那么每个物品也只有选和不选,该物品不选就是dp[i][j]//选的话就是dp[i - x][j - y] + 1,选择该物品的话要将装入前能装的最多物品加1,也就是加上这个物品//本题是把每个子集当做一个物品//确定dp数组int dp[][] = new int[m + 1][n + 1];//初始化dp数组dp[0][0] = 0;//遍历物品for (String s : strs) {int x = 0, y = 0;//统计每个物品的01数量for (int v = 0;v < s.length();v ++) {if (s.charAt(v) == '0') {x++;} else {y++;}}//遍历背包//由于背包是俩个维度所以俩个要从后往前遍历 确保物品只放入了一次for (int i = m; i >= x; i--) {for (int j = n; j >= y; j--) {//递推公式dp[i][j] = Math.max(dp[i][j], dp[i - x][j - y] + 1);}}}return dp[m][n];}
}

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!

相关文章:

力扣474-一和零(Java详细题解)

题目链接&#xff1a;474. 一和零 - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 最近刚学完01背包&#xff0c;所以现在的题解都是以01背包问题为基础再来写的。 如果大家不懂01背包的话&#…...

【话题】量子计算:前沿技术与应用前景深度解析

引言 在当今信息时代&#xff0c;计算能力已成为推动科技进步和社会发展的重要驱动力。随着摩尔定律逐渐接近其物理极限&#xff0c;传统计算机硬件的性能提升面临前所未有的挑战。在此背景下&#xff0c;量子计算作为一种革命性的计算范式&#xff0c;凭借其独特的量子力学属性…...

第11章 32位x86处理器编程架构

第11章 32位x86处理器编程架构 IA-32(INTEL Architecture, 32-bit)&#xff1a;INTEL 32位处理器架构简称IA-3&#xff0c;以8086处理器为基础发展起来的。该章重点介绍了IA-32处理器的工作方式和相关技术。 IA-32架构的基本执行环境 寄存器的扩展 32位处理器通用寄存器&am…...

加密软件是什么?有哪些用处呢?

一、加密软件是什么&#xff1f; 加密软件用于对数据进行加密和解密的工具或程序。其主要功能是通过使用加密算法将原始数据转换为密文&#xff0c;以保护数据的机密性和安全性&#xff0c;防止未经授权的访问和泄露。加密软件提供用户友好的界面和操作方式&#xff0c;使用户…...

浅谈C#之任务调度TaskScheduler

一、基本介绍 TaskScheduler 是一个抽象类&#xff0c;用于控制任务的执行方式&#xff0c;特别是它们如何被安排到线程池中的线程上执行。 TaskScheduler 负责将 Task 对象排队并决定何时、以何种方式执行这些任务。 二、TaskScheduler的作用 调度任务&#xff1a;将任务分配…...

SQL server 日常运维命令

一、基础命令 查看当前数据库的版本 SELECT VERSION;查看服务器部分特殊信息 select SERVERPROPERTY(Nedition) as Edition --数据版本&#xff0c;如企业版、开发版等,SERVERPROPERTY(Ncollation) as Collation --数据库字符集,SERVERPROPERTY(Nservername) as Serve…...

基于协同过滤算法+SpringBoot+Vue+MySQL的商品推荐系统

系统展示 用户前台界面 管理员后台界面 系统背景 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛运用&#xff0c;以及…...

VSCode中latex文件(Misplaced alignment tab character .LaTeX

Misplaced alignment tab character &.LaTeX 先给出参考文章1 Misplaced alignment tab character &.LaTeX 把bib文件中的 &改为 and 。删除原有的bbl文件、重新运行 选择这个运行 这个错误在overleaf上并没有遇到、在vscode上遇到了 方法二就是把 &改为…...

如何给电脑设置静态IP地址:详细步骤与指南

在日常生活和工作中&#xff0c;我们经常需要使用电脑连接到网络。通常情况下&#xff0c;电脑会自动获取IP地址&#xff0c;但有时候&#xff0c;由于特定的网络需求或配置&#xff0c;我们可能需要手动为电脑设置静态IP地址。本文将详细介绍如何在Windows和Mac操作系统中为电…...

【Mysql】系统服务启动访问报错问题处理:this is incompatible with sql_mode=only_full_group_by

一、背景&#xff1a; 本来已经正常运行的平台&#xff0c;突然有一天由于对服务器进行部分操作迁移&#xff0c;发现jar可以正常启动&#xff0c;但是访问功能一直报错&#xff0c;监控后台日志后&#xff0c;发现了问题&#xff1a; 报错的具体信息如下&#xff1a; Caused…...

安装oh-my-zsh后报错zsh: command not found: conda问题解决

zsh: command not found: conda问题解决 一、问题介绍与环境介绍 系统为macOS Sonoma 14.5 所用终端为zsh 主要问题&#xff1a;安装了oh-my-zsh之后conda命令在终端中不可用。 二、原因分析 终端中zsh的可访问的程序一般放在/bin, /usr/bin, /usr/local/bin&#xff0c;~/bi…...

避免 PyCharm 将该 Python 脚本作为测试运行

为了避免 PyCharm 将该 Python 脚本作为测试运行&#xff08;即 pytest 自动捕获&#xff09;&#xff0c;你可以做以下几步来确保该脚本作为普通的 Python 程序执行&#xff0c;而不是作为 pytest 运行。 解决方案&#xff1a; 1. 确保文件名不以 test_ 开头&#xff1a; P…...

【Sqlite】.NET Framework使用Sqlite的注意事项

注意&#xff1a;NuGet引入System.Data.SQLite.Core不要引入System.Data.SQLite 注意&#xff1a;局域网共享链接 正常链接Data Source\\BAT-OCV\SqliteDB\batOCV.db;Version3;PoolingTrue;Max Pool Size100; 局域网链接Data Source\\\BAT-OCV\SqliteDB\batOCV.db;Version3;P…...

2024下《系统集成项目管理工程师》50个高频考点汇总!值得收藏

11月软考已经迫在眉睫&#xff0c;准备考系统集成的小伙伴们开始准备了吗&#xff1f; 这里给大家整理了50个高频考点&#xff0c;涵盖全书80%重点&#xff0c;先把这个存下&#xff01;再慢慢看书&#xff0c;边看书边背这个&#xff0c;事半功倍。 1、信息安全的基本要素有&…...

Java 远程调用接口(RMI)

Java Remote Method Invocation (RMI) 概述 Java 的 Remote Method Invocation (RMI) 是一种允许 Java 程序调用远程对象的方法。这种方法类似于本地调用&#xff0c;但目标对象实际位于远程 JVM&#xff08;Java 虚拟机&#xff09;中。RMI 实现了分布式计算&#xff0c;允许…...

torch.squeeze()

在深度学习中经常会遇见这个函数&#xff0c;现在来说一下这个函数的用法&#xff0c;其实很简单的。 函数作用 函数的作用就是&#xff1a;挤压size为1的维度&#xff0c;挤压也就是remove。如果size不是1的话&#xff0c;那就没变化。 使用说明 在使用的时候&#xff0c;…...

COD论文笔记 BiRefNet

本质还是一个 U 型编码器解码器结构的分割模型。 我可以考虑将©和(d)结合&#xff0c;即对解码器的输入不进行 patchify,同时在各个阶段引入梯度参考信息 最近的相关工作&#xff0c;中间监督、额外先验(频率&#xff0c;梯度&#xff0c;边缘等)取得不错效果 作者观察到…...

表单项标签简单学习

目录 1. 单选框 radio​ 编辑​编辑​编辑​编辑 2. 复选框 checkbox ​编辑​编辑​编辑 3. 隐藏域 hidden 4. 多行文本框 textarea​ 编辑​编辑 5. 下拉框 select​ 编辑​编辑 6. 选择头像​编辑​编辑 <!DOCTYPE html> <html lang"en"> <h…...

固态硬盘和机械硬盘区别?固态硬盘和机械硬盘哪个好?

在当今数据时代&#xff0c;硬盘作为电脑里的存储设备在我们的生活和工作中扮演着十分重要的角色。随着存储技术的进步&#xff0c;市场上出现了两种主流硬盘&#xff1a;固态硬盘和机械硬盘。它们各有优劣&#xff0c;那么二者究竟有什么区别&#xff1f;我们又该如何选择呢&a…...

QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第三期]

QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第三期] 第三期介绍&#xff1a;频道模块之频道成员 目录 QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第三期]第三期介绍&#xff1a;频道模块之频道成员获取子频道在线成员数获取频道成员列表获取频道身份组成员列…...

Serilog:从结构化日志认知到 .NET 工程落地

MySQL 中的 count 三兄弟&#xff1a;效率大比拼&#xff01; 一、快速结论&#xff08;先看结论再看分析&#xff09; 方式 作用 效率 一句话总结 count(*) 统计所有行数 最高 我是专业的&#xff01;我为统计而生 count(1) 统计所有行数 同样高效 我是 count(*) 的马甲兄弟…...

Apifox供应链投毒攻击--完整解析

&#x1f534; 安全应急通告&#xff1a;Apifox 桌面端供应链投毒与高危凭证窃取事件 一、 事件概述 近期监测到 Apifox 公网 SaaS 版桌面客户端遭遇严重的供应链投毒攻击。攻击者通过劫持合法的运行追踪模块&#xff0c;向用户下发具备凭证窃取、动态执行与持久化能力的恶意 J…...

【技术解析】SimpleNet:用极简网络架构革新工业图像异常检测

1. 工业图像异常检测的现状与挑战 工业生产线上的质检环节一直是个让人头疼的问题。想象一下&#xff0c;你站在一条每分钟生产上百件产品的流水线旁&#xff0c;需要肉眼检查每个产品表面是否有划痕、凹陷或污渍——这几乎是不可能完成的任务。传统计算机视觉方法在这个领域已…...

基于博途1200PLC + HMI的交通灯控制系统仿真:打造灵活交通指挥中枢

基于博途1200PLCHMI交通灯/红绿灯控制系统仿真(时间可设置) 程序&#xff1a; 1、任务&#xff1a;PLC.人机界面控制交通灯 2、系统说明&#xff1a; 系统设有手动模式、自动模式、黄闪模式、红绿灯时间可设置、各灯可单独手动模式、故障模拟模式、数码管显示等模式运行 交通灯…...

别再只盯着EMD了!滚动轴承故障诊断,试试VMD和MCKD这些新方法(附Python代码对比)

滚动轴承故障诊断&#xff1a;VMD与MCKD的实战对比与Python实现 滚动轴承作为旋转机械的核心部件&#xff0c;其健康状态直接影响设备运行安全。传统经验模态分解&#xff08;EMD&#xff09;虽广泛应用&#xff0c;但在处理强噪声和非平稳信号时存在明显局限。本文将深入解析变…...

新手最值得入的一款ai音乐工具

2026年&#xff0c;ai音乐爆发的一年。国内国外各种AI音乐工具层出不穷。想要尝试AI音乐的新手宝宝该怎么去选择呢&#xff1f;市面上大大小小的ai音乐创作软件我基本都尝试过。我觉得只有一款工具是最值得推荐的&#xff0c;也是我使用的最多的。那就是蘑兔AI&#xff0c;你们…...

AzurLaneAutoScript:碧蓝航线全自动游戏助手,释放您的双手与时间

AzurLaneAutoScript&#xff1a;碧蓝航线全自动游戏助手&#xff0c;释放您的双手与时间 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAuto…...

CentOS部署PHP项目完整步骤

CentOS 7.9 部署 PHP 7.4 MySQL 5.7.44 完整步骤 由于 CentOS 7 已于 2024 年 6 月 30 日停止官方维护&#xff0c;原有的 yum 源已不可用&#xff0c;因此必须首先更换为阿里云镜像源才能正常安装软件。 一、系统环境准备 1.1 更换阿里云 YUM 源 # 1. 备份原有源 mv /etc/yum…...

新手零基础入门:用快马生成你的第一个dify对话应用

今天想和大家分享一个特别适合新手入门的实践&#xff1a;用InsCode(快马)平台快速搭建你的第一个dify对话应用。作为一个刚接触AI开发的小白&#xff0c;我发现这个平台真的能省去很多麻烦的配置步骤&#xff0c;特别适合想快速看到成果的新手。 为什么选择dify作为入门&…...

DMA传输效率翻倍秘籍:深入解析Burst/Transfer模式在TMS320系列DSP中的配置陷阱

DMA传输效率翻倍秘籍&#xff1a;深入解析Burst/Transfer模式在TMS320系列DSP中的配置陷阱 实时信号处理系统的性能瓶颈往往出现在数据传输环节。当工程师面对高速ADC采集的海量数据时&#xff0c;DMA控制器的高效配置直接决定了系统能否实现理论上的吞吐量。本文将深入剖析TMS…...