java一和零(力扣Leetcode474)

一和零

力扣原题

给定一个二进制字符串数组 strs 和两个整数 mn,请你找出并返回 strs 的最大子集的长度,该子集中最多有 m 个 0 和 n 个 1。

示例 1:

输入:strs = [“10”, “0001”, “111001”, “1”, “0”], m = 5, n = 3
输出:4
解释:最多有 5 个 0 和 3 个 1 的最大子集是 {“10”,“0001”,“1”,“0”} ,因此答案是 4 。
其他满足题意但较小的子集包括 {“0001”,“1”} 和 {“10”,“1”,“0”} 。{“111001”} 不满足题意,因为它含 4 个 1 ,大于 n 的值 3 。

示例 2:

输入:strs = [“10”, “0”, “1”], m = 1, n = 1
输出:2
解释:最大的子集是 {“0”, “1”} ,所以答案是 2 。

二维数组解法

在这里插入图片描述

分析

这是一个典型的二维动态规划问题。我们可以将每个字符串看作是一种物品,其中 0 的个数和 1 的个数就是物品的体积和价值。题目要求最大子集的长度,相当于要求装入背包的物品数量的最大值,而背包的容量由给定的 mn 决定。

状态定义

我们定义一个二维的动态规划数组 dp,其中 dp[i][j] 表示在前 i 个字符串中,能够拥有不超过 m 个 0 和不超过 n 个 1 的最大子集的长度。

状态转移方程 (二维背包问题,实质上还是01背包,因为“物品”只能选一次)

在状态转移方程中,我们需要考虑当前字符串是否放入背包中的两种情况:

  • 如果不放入当前字符串,则 dp[i][j] = dp[i-1][j]
  • 如果放入当前字符串,则 dp[i][j] = dp[i-1][j-当前字符串中0的个数][j-当前字符串中1的个数] + 1

综合以上两种情况,状态转移方程为:

dp[i][j] = max(dp[i-1][j], dp[i-1][j-当前字符串中0的个数][j-当前字符串中1的个数] + 1)

初始化

我们需要对动态规划数组进行初始化,当没有字符串时或背包容量为0时。

Java解题

class Solution {public int findMaxForm(String[] strs, int m, int n) {int[][] dp = new int[m + 1][n + 1]; // 初始化动态规划数组for (String str : strs) { // 遍历物品,每个物品(每个字符串)只能使用一次,相当于01背包int zeros = 0, ones = 0; // 每次循环都初始化 统计当前字符串中0和1的个数for (char c : str.toCharArray()) {if (c == '0') zeros++;//计算“0物品”的重量else ones++;//计算“1物品”的重量}//遍历背包,相当于背包有两个维度for (int i = m; i >= zeros; i--) { // 更新动态规划数组for (int j = n; j >= ones; j--) {dp[i][j] = Math.max(dp[i][j], dp[i - zeros][j - ones] + 1);}}}return dp[m][n]; // 返回最大子集的长度}
}

总结

通过以上步骤,我们可以解决这个问题。首先将每个字符串看作是一种物品,然后根据动态规划的思想进行状态转移,最终返回最大子集的长度。

三维数组解法

在这里插入图片描述

分析

这是一个典型的动态规划问题。我们需要在满足条件的情况下找出最大子集的长度。可以将问题转化为01背包问题,其中背包的容量为 (m, n),物品的重量和价值分别为字符串中 0 和 1 的数量。

状态定义

定义一个三维动态规划数组 dp,其中 dp[i][j][k] 表示在前 i 个字符串中,最多有 j 个 0 和 k 个 1 的最大子集的长度。

状态转移方程

对于每一个字符串 strs[i],我们有两种选择:选择或者不选择。因此状态转移方程为:

dp[i][j][k] = max(dp[i - 1][j][k], dp[i - 1][j - zero][k - one] + 1)

其中 zeroone 分别表示字符串 strs[i] 中 0 和 1 的数量。

初始化

我们需要对动态规划数组进行初始化。初始时,前 0 个字符串中最多有 0 个 0 和 0 个 1 的最大子集的长度为 0。

Java解题

class Solution {public int findMaxForm(String[] strs, int m, int n) {int[][][] dp = new int[strs.length + 1][m + 1][n + 1];for (int i = 1; i <= strs.length; i++) {int[] count = countZeroesOnes(strs[i - 1]);int zeros = count[0], ones = count[1];for (int j = 0; j <= m; j++) {for (int k = 0; k <= n; k++) {dp[i][j][k] = dp[i - 1][j][k];if (j >= zeros && k >= ones) {dp[i][j][k] = Math.max(dp[i][j][k], dp[i - 1][j - zeros][k - ones] + 1);}}}}return dp[strs.length][m][n];}private int[] countZeroesOnes(String str) {int[] count = new int[2];for (char c : str.toCharArray()) {count[c - '0']++;}return count;}
}

总结

通过动态规划的思想,我们可以解决这个问题。首先计算每个字符串中 0 和 1 的数量,然后根据状态转移方程进行状态转移,最终返回最大子集的长度。

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

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

相关文章

【msyql】mysqldump: 未找到命令...

使用mysqldump备份数据库出现错误提示&#xff1a; mysqldump: 未找到命令... 执行的命令如下&#xff1a; mysqldump -uroot -proot --databases db_user > /home/backups/databackup.sql 解决方法 确认mysql是否安装 查看mysql版本 mysql --version 查找mysql安装路…

php反序列化刷题1

[SWPUCTF 2021 新生赛]ez_unserialize 查看源代码想到robots协议 看这个代码比较简单 直接让adminadmin passwdctf就行了 poc <?php class wllm {public $admin;public $passwd; }$p new wllm(); $p->admin "admin"; $p->passwd "ctf"; ec…

Dockerfile将jar部署成docker容器

将jar包copy到linux&#xff0c;新建Dockerfile文件 -rw-r--r-- 1 root root 52209844 Mar 25 22:55 data-sharing-0.0.1-SNAPSHOT.jar -rwxrwxrwx 1 root root 227 Mar 25 22:57 Dockerfile [rootlocalhost mnt]# pwd /mntDockerfile内容 # 指定基础镜像 FROM java:8-a…

极光笔记|极光消息推送服务的云原生实践

摘要 极光始终秉承“以开发者为中心”的战略导向&#xff0c;极光推送&#xff08;JPush&#xff09;是国内领先的消息推送服务。极光推送&#xff08;JPush&#xff09;本质上是一种软件付费应用程序&#xff0c;结合当前主流云厂商基础施设&#xff0c;逐渐演进成了云上SaaS…

Java后端设置服务器允许跨域

文章目录 1、实现2、一些问题关于各项请求头的作用关于预检请求 3、一些补充4、疑问点 1、实现 以下通过servlet的Filter给所有响应的header加了一些跨域相关的数据&#xff0c;以实现允许跨域。 import org.springframework.context.annotation.Configuration; import org.s…

数据可视化基础与应用-04-seaborn库从入门到精通01-02

总结 本系列是数据可视化基础与应用的第04篇seaborn&#xff0c;是seaborn从入门到精通系列第1-2篇。本系列的目的是可以完整的完成seaborn从入门到精通。主要介绍基于seaborn实现数据可视化。 参考 参考:数据可视化-seaborn seaborn从入门到精通01-seaborn介绍与load_datas…

RabbitMQ3.x之二_RabbitMQ所有端口说明及开启后台管理功能

RabbitMQ3.x之二_RabbitMQ所有端口说明及开启后台管理功能 文章目录 RabbitMQ3.x之二_RabbitMQ所有端口说明及开启后台管理功能1. RabbitMQ端口说明2. 开启Rabbitmq后台管理功能1. 查看rabbitmq已安装的插件2. 开启rabbitmq后台管理平台插件3. 开启插件后&#xff0c;再次查看插…

RSTP环路避免实验(华为)

思科设备参考&#xff1a;RSTP环路避免实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 RSTP (Rapid Spanning Tree Protocol) 是从STP发展而来 • RSTP标准版本为IEEE802.1w • RSTP具备STP的所有功能&#xff0c;可以兼容STP运行 • RSTP和STP有所不同 减少了…

Tomcat下载安装以及配置

一、Tomcat介绍 二、Tomcat下载安装 进入tomcat官网&#xff0c;https://tomcat.apache.org/ 1、选择需要下载的版本&#xff0c;点击下载 下载路径一定要记住&#xff0c;并且路径中尽量不要有中文 8、9、10都可以&#xff0c;本博文以8为例 2、将下载后的安装包解压到指定位…

linux-开发板移植MQTT

将源码复制到共享文件夹 链接&#xff1a;https://pan.baidu.com/s/1kvvO-HhDMDXkQ_wlNtyW_A?pwd332i 提取码&#xff1a;332i 以下步骤教程里都写了&#xff0c;我这里边进行&#xff0c;方便大家对照 pc端 1.进入mqtt_lib, 解压open压缩包 2.按照教程复制这一句并运行&…

服务端应用多级缓存架构方案

服务端应用多级缓存架构方案 场景 20w的QPS的场景下&#xff0c;服务端架构应如何设计&#xff1f; 常规解决方案 可使用分布式缓存来抗&#xff0c;比如redis集群&#xff0c;6主6从&#xff0c;主提供读写&#xff0c;从作为备&#xff0c;不提供读写服务。1台平均抗3w并…

【算法专题--双指针算法】leecode-15.三数之和(medium)、leecode-18. 四数之和(medium)

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 前言1. 三数之和2. 解法&…

选择最佳图像处理工具OpenCV、JAI、ImageJ、Thumbnailator和Graphics2D

文章目录 1、前言2、 图像处理工具效果对比2.1 Graphics2D实现2.2 Thumbnailator实现2.3 ImageJ实现2.4 JAI&#xff08;Java Advanced Imaging&#xff09;实现2.5 OpenCV实现 3、图像处理工具结果 1、前言 SVD(stable video diffusion)开放了图生视频的API&#xff0c;但是限…

使用GPT将文档生成问答对

根据文档生成问题列表 url https://api.openai.com/v1/chat/completions# 替换为您自己的API密钥 api_key sk-xxxxxxxxxmodel "gpt-3.5-turbo-16k"prompt1 #01 你是一个问答对数据集处理专家。 #02 你的任务是根据我给出的内容&#xff0c;生成适合作为问答对数…

Ubuntu deb文件 安装 MySQL

更新系统软件依赖 sudo apt update && sudo apt upgrade下载安装包 输入命令查看Ubuntu系统版本 lsb_release -a2. 网站下载对应版本的安装包 下载地址. 解压安装 mkdir /home/mysqlcd /home/mysqltar -xvf mysql-server_8.0.36-1ubuntu20.04_amd64.deb-bundle.tar# …

Elasticsearch性能优化:实战策略与最佳实践

-在数据密集型的应用场景中&#xff0c;Elasticsearch作为一个强大的搜索和分析引擎&#xff0c;能够提供快速的搜索能力和处理大规模数据的能力。然而&#xff0c;随着数据量的增长和查询需求的复杂化&#xff0c;对Elasticsearch的性能优化成为了维护高效、稳定服务的重要任务…

中间件学习

一、ES 场景&#xff1a;某头部互联⽹公司的好房业务&#xff0c;双⼗⼀前⼀天&#xff0c;维护楼盘的运营⼈员突然接到合作开发商的通知&#xff0c;需要上线⼀批热⻔的楼盘列表&#xff0c;上传完成后&#xff0c;C端⼩程序⽀持按楼盘的名称、户型、⾯积等产品属性全模糊搜索…

aardio - godking.json 【库】测试

godkong.json1 : 主要针对数值进行了处理。 1、内部创建了一个数值处理类&#xff0c;所有数值均以数值对象类型保存&#xff0c;以避免将数值识别为科学计数法文本。 2、读取数值成员时&#xff0c;需用 tostring() 转换为数值文本。 3、数值可以读取&#xff0c;可以赋值(数值…

Spring与Spring Boot:理解它们的区别与适用场景

引言 在Java开发领域&#xff0c;Spring和Spring Boot是两个非常重要的框架。它们被广泛应用于企业级应用开发、微服务架构构建等场景。尽管Spring Boot是Spring框架的一个扩展&#xff0c;但它们之间仍然存在一些重要区别。本文将详细介绍这些区别&#xff0c;帮助读者更好地…

【考研数学】张宇最新全年学习包

考研数学冲高分必备&#xff0c;张宇老师肯定榜上有名&#xff01; 考研数学&#xff0c;其实就像一场没有硝烟的战斗。基础题是常规武器&#xff0c;中难题就是重型火炮&#xff0c;而压轴题呢&#xff0c;那就是核弹级别的存在&#xff01;考研的战场&#xff0c;关键就在那…