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

news2024/9/21 12:40:21

题目链接: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];
    }
}

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

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

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

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

相关文章

运维问题0002:SAP多模块问题-SAP系统程序在执行时,跳出“加急快件”窗口,提示:快件文档“更新已终止”从作者***收到

1、问题描述 近期收到2起业务报障&#xff0c;均反馈在SAP执行程序时&#xff0c;弹出“加急快件”窗口&#xff0c;导致操作的业务实际没有更新完成。 1&#xff09;业务场景一&#xff1a;设备管理部门在操作事务代码&#xff1a;AS02进行资产信息变更时&#xff0c;保存正常…

面试官:为什么 Redis 6.0 之后引入多线程?

大家好&#xff0c;我是大明哥&#xff0c;一个专注「死磕 Java」系列创作的硬核程序员。 回答 Redis 的性能瓶颈从来都不是 CPU&#xff0c;是网络I/O 和内存。 内存好解决&#xff0c;加机器内存和优化数据结构。 网路 I/O 的优化才是大头&#xff0c;因为读写网络的 read…

最新大厂薪资职级表,我酸了。。

大家好&#xff01;我是鸭鸭&#xff01; 又到周末&#xff0c;让我们轻松一下&#xff0c;来吃吃瓜&#xff01; 大厂往往会提供具有竞争力的薪资和福利待遇&#xff0c;正值秋招&#xff0c;相关热帖也是又被翻了出来。鸭鸭今天就刷到一个帖子&#xff0c;据说是几家互联网…

基于构件开发-系统架构师(六十四)

1&#xff08;&#xff09;常见的功能包括版本控制&#xff0c;变更管理&#xff0c;配置状态管理&#xff0c;访问控制和安全控制等。 A软件测试工具 B版本控制工具 C软件维护工具 D软件配置管理工具 解析&#xff1a; 软件过程工具分为&#xff1a;软件开发工具&#xf…

史上最全-经管类国家社科基金立项名单汇总 1991-2024

数据说明&#xff1a;本次数据包括以下内容&#xff1a; 1.国家自科基金立项名单&#xff08;2022-2024&#xff09; 2.国家社科基金立项名单&#xff08;2008-2018&#xff09; 数据简介&#xff1a;国家自然科学基金是中国支持基础研究的主渠道之一&#xff0c;面向全国&am…

容易中、见刊快的6本医学期刊推荐!

常笑医学整理了6本容易中、见刊快的医学期刊&#xff0c;以及期刊详细参数与投稿经验&#xff0c;供医生、医学生们在论文投稿时参考。投稿经历均来自常笑医学网用户真实分享&#xff0c;欢迎大家到常笑医学网分享自己的投稿经历和实用经验。 1.《中国医药科学》 &#xff08;详…

两个月冲刺软考——校验码的三种类型;编译过程;翻译器与解释器的对比;补充CPU的内容

1.校验码 是通过扩大码距从而实现校验的。 那什么是码距呢&#xff1f;任何一种编码都由许多码字组成的&#xff0c;任意两个码字之间最少变化的二进制位数就称为数据校验码的码距。 对于这个概念可以这样理解&#xff1a;想象一个地图上的城市网络&#xff0c;每个城市代表一…

STM32时钟配置图详解

一图概述&#xff1a; 左侧输入时钟源 Input Frequency (LSE/LSI/HSI/HSE) LSE (Low-Speed External)&#xff1a;外部32.768 kHz晶体振荡器&#xff0c;通常用于RTC&#xff08;实时时钟&#xff09;。LSI (Low-Speed Internal)&#xff1a;内部低速时钟&#xff0c;频率为…

C# 混淆加密大师1.2.5更新功能介绍, 附CSDN下载链接

C#混淆加密大师支持 .Net Framework 2.0到.Net Framework 4.x&#xff0c;以及.NET Core 2.0至最新的.NET 8版本的C#程序, 包括Winform、WPF、Unity游戏以及控制台程序的混淆加密, 可有效保护C#程序代码&#xff0c;防止非法复制或篡改, 保护知识产权. 特性 1. 支持多种不同的…

虚拟机苹果系统的QT安装体验

前言 苹果系统MacOS中除了安装XCode&#xff0c;完全可以安装QT。本质上来讲&#xff0c;苹果系统就是Linux改装版本&#xff0c;实际上和Ubuntu非常的接近。 1、Mac对应的QT安装包的下载 安装参考链接&#xff1a;MacOS下Qt 5开发环境安装与配置_macos qt-CSDN博客 苹果系统…

宠物空气净化器测评:霍尼韦尔、希喂、米家、有哈、范罗士哪款吸浮毛效果好

作为一个忙碌、精致的搬砖人&#xff0c;我开始是没想过我会养带毛的动物的。自己就很忙了&#xff0c;哪有时间清理宠物弄脏的房间。无奈&#xff0c;三年前某天下班&#xff0c;刚进到小区就被楼下一只小流浪缠上了。买了两根火腿肠喂了还不够&#xff0c;非得跟着我到单元楼…

Jedis,SpringDataRedis

快速入门 导入依赖 <!--jedis--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version></dependency><!--单元测试--><dependency><groupId>org.ju…

SPI子系统

IO特性 SPI接口一般使用四条信号线通信&#xff1a; SDI&#xff08;数据输入&#xff09;&#xff0c;SDO&#xff08;数据输出&#xff09;&#xff0c;SCK&#xff08;时钟&#xff09;&#xff0c;CS&#xff08;片选&#xff09; MISO&#xff1a; 主设备输入/从设备输出…

每日刷题(二分)

E. Klees SUPER DUPER LARGE Array!!! https://codeforces.com/contest/2009/problem/E 思路&#xff1a; 题目让我们求从k开始的n个数的前k个数的和与剩下的数的和的差最小是多少&#xff0c;可以用数学思维O(1)求解&#xff0c;都是我数学比较差&#xff0c;我们这里用二分…

企业财税自动化解决方案的成本效益分析与投资回报预测

随着企业规模的扩大和业务复杂度的增加&#xff0c;企业在财务管理方面也面临着诸多挑战&#xff0c;传统的财务管理方式逐渐无法满足企业经营需求&#xff0c;借助财税自动化解决方案来提高财务效率和准确性、降低人力成本&#xff0c;为企业带来长期的效益提升&#xff0c;已…

基于MATLAB的图像融合设计

摘 要 图像融合能够将不同类型传感器获取的同一对象的图像数据进行空间配准。并且采用一定的算法将不同类型的传感器获取的同一对象的图像数据所含用的信息优势或互补性有机地结合起来产生的新的图像数据。这种新数据含有所研究对象的更多信息表征&#xff0c;与单一图像相对比…

《python语言程序设计》2018版第8章第15题商业:检测ISBN-10一个国际标准书号

这个作者一天净出幺蛾子.我这边还老打错字,我现在都不敢用缩写,都是全拼 str_vis_text "013601267" len_num len(str_vis_text)def run_text(num_t, text_about):text_sum 0for i in range(0, num_t):text_sum if_digit(text_about[i])*(i1)print(text_sum%11)pr…

Python框架Pandas:DataFrame的应用

一、DataFrame DataFrame是什么&#xff1f; 1.1 DataFrame的创建 1.1.1 方式一&#xff1a;使用字典加列表创建df&#xff0c;使用默认自增索引 import pandas as pd # 使用字典加列表创建df&#xff0c;使用默认自增索引 df1_data {日期:[2021-08-21,2021-08-22,2021-0…

应用连接错误,初始化mysql数据库恢复---惜分飞

有人在部署一个新网站的时候,写错了配置信息,直接导致原有数据库被清掉,并创建了新库和写入了数据(其实本质就是drop table恢复) 登录操作系统查看,发现数据库文件在根分区,创建了新库,写入了数据之外,还有几个G的binlog.全部恢复不太可能,最后客户决定需要恢复的2个核心表数…

如何将写好的Java代码打成jar包放在hadoops上运行

1、打包java文件 2、jar包上传&#xff0c;hadoop执行 我们将打好的jar包上传到Linux&#xff0c;因为hadoop是安装在Linux上的&#xff0c;然后用hadoop执行&#xff0c;执行前要确保已经在Linux上配置了hadoop的环境变量&#xff0c;不然就要到hadoop的目录下执行该命令 执…