算法训练营Day37

#Java #动态规划

Feeling and experiences:

目标和:力扣题目链接

给你一个非负整数数组 nums 和一个整数 target

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

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

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

示例 1:

输入:nums = [1,1,1,1,1], target = 3
输出:5
解释:一共有 5 种方法让最终目标和为 3 。
-1 + 1 + 1 + 1 + 1 = 3
+1 - 1 + 1 + 1 + 1 = 3
+1 + 1 - 1 + 1 + 1 = 3
+1 + 1 + 1 - 1 + 1 = 3
+1 + 1 + 1 + 1 - 1 = 3

这道题首先想到的是用回溯来做,因为就只有加减两种,要么取减法,要么取加法。

代码如下:

class Solution {int count=0;//全局变量!public int findTargetSumWays(int[] nums, int target) {//用回溯来做back(nums,target,0,0);return count;}//back方法public void back(int[] nums,int target,int index,int sum){//如果遍历到了最后:if(index == nums.length){  //注意 最后一个数要遍历完(所以要在最后一个数的后面)if(sum == target){count++;}}else{//回溯加法back(nums,target,index+1,sum+nums[index]);//回溯减法back(nums,target,index+1,sum-nums[index]);}}
}

虽然代码易懂,好想到,但是时间复杂度高,且在此章节还是要用动态规划。

class Solution {public int findTargetSumWays(int[] nums, int target) {int sum = 0;// 计算所有数字的和for (int num : nums) {sum += num;}// 计算和与目标值之间的差值int diff = sum - target;// 如果差值是负数或者不是偶数,则不存在解决方案if (diff < 0 || diff % 2 != 0) {return 0;}int n = nums.length, neg = diff / 2;// 创建动态规划表int[][] dp = new int[n + 1][neg + 1];// 初始化动态规划表dp[0][0] = 1;// 填充动态规划表for (int i = 1; i <= n; i++) {int num = nums[i - 1];for (int j = 0; j <= neg; j++) {// 计算不包含当前数字的情况dp[i][j] = dp[i - 1][j];// 如果可以加上当前数字,则累加上这种情况if (j >= num) {dp[i][j] += dp[i - 1][j - num];}}}// 返回结果return dp[n][neg];}
}

计算数组总和:首先,计算数组 nums 中所有元素的总和 sum。


确定剩余数:计算 sum - target。这一步是为了找出需要通过减法(即视为负数)得到的数的总和。


检查剩余数的奇偶性:如果 sum - target 是负数或奇数,那么问题无解。负数意味着目标和比所有数的总和还大,奇数意味着无法通过整数的加减组合得到目标和。


初始化动态规划数组:创建一个二维数组 dp,其中 dp[i][j] 表示在前 i 个数中选择一些数作为负数,使得这些负数的总和为 j 的方法数。


填充动态规划数组:
• 初始化 dp[0][0] = 1,表示没有选择任何数字时,和为 0 的方法只有一种。
• 对于每个数 nums[i] 和每个可能的和 j,更新 dp[i][j]。有两种情况:
• 不使用 nums[i]:此时方法数为 dp[i-1][j]。
• 使用 nums[i](作为负数):如果 j >= nums[i],方法数增加 dp[i-1][j-nums[i]]。


返回结果:dp[n][neg] 是最终答案,其中 n 是数组的长度,neg 是 (sum - target) / 2 的值。

一和零:力扣题目链接

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

请你找出并返回 strs 的最大子集的长度,该子集中 最多m0n1

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

示例 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 。

要先确定dp数组的含义,才能进行递推:

dp[i][j]:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]

class Solution {public int findMaxForm(String[] strs, int m, int n) {// dp[i][j] 表示最多有 i 个 0 和 j 个 1 时的字符串的最大数量int[][] dp = new int[m + 1][n + 1];int oneNum, zeroNum;// 遍历每个字符串for (String str : strs) {oneNum = 0;zeroNum = 0;// 统计字符串中 0 和 1 的数量for (char ch : str.toCharArray()) {if (ch == '0') {zeroNum++;} else {oneNum++;}}// 倒序遍历,以避免重复计算for (int i = m; i >= zeroNum; i--) {for (int j = n; j >= oneNum; j--) {// 更新 dp 表,决定是否选择当前字符串dp[i][j] = Math.max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);}}}// 返回最终结果return dp[m][n];}
}

 初始化动态规划数组:dp[i][j] 表示在最多使用 i 个 0 和 j 个 1 的情况下,能构成的最大子集数量。


 遍历字符串数组:对于每个字符串,计算其中 0 和 1 的数量。


  动态规划状态转移:对于每个字符串,更新动态规划表。如果当前字符串的 0 和 1 数量分别为 zeroNum 和 oneNum,那么对于每个 i >= zeroNum 和 j >= oneNum,检查是否将当前字符串加入子集中可以得到更大的子集数量。


  倒序更新:动态规划表需要从大到小更新,以避免在更新过程中使用到本轮已经更新过的值,从而保证每个字符串只被考虑一次。

这道题我认为关键在于怎么写dp数组,dp数组含义怎么理解。

理解到了,递推其实并不难:

• 我们从 m 到 zeroNum,从 n 到 oneNum 倒序遍历。对于每对 (i, j),我们有两个选择:
• 不包含当前字符串:此时子集的大小保持为 dp[i][j]。
• 包含当前字符串:如果包含当前字符串,子集大小将增加 1,但我们需要使用 zeroNum 个 0 和 oneNum 个 1。因此,新的子集大小为 dp[i - zeroNum][j - oneNum] + 1。
• 我们取这两种选择中的最大值来更新 dp[i][j]。

“一双桨悠懒,

一绵江风微拂素罗衫”

Fighting!


 


 

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

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

相关文章

facebook广告素材制作要注意哪些

在制作Facebook广告素材时&#xff0c;需要注意以下几点&#xff1a; 目标受众&#xff1a;了解目标受众的喜好、需求和兴趣&#xff0c;以便制作能够吸引他们的广告素材。广告格式&#xff1a;选择适合广告内容的格式&#xff0c;如图片、视频、幻灯片等。同时&#xff0c;要…

jmeter--1.安装

目录 1. jmeter和jdk下载地址 2. jdk环境变量配置 3. Jmeter的环境变量配置 1. jmeter和jdk下载地址 链接&#xff1a;https://pan.baidu.com/s/1C8ItsR8ZUGJO9uyTJ-9QtQ?pwdx5m5 提取码&#xff1a;x5m5 2. jdk环境变量配置 2.1 我的电脑右键属性-->高级系统设置--&…

20240111在ubuntu20.04.6下解压缩RAR格式的压缩包

20240111在ubuntu20.04.6下解压缩RAR格式的压缩包 2024/1/11 18:25 百度搜搜&#xff1a;ubuntu rar文件怎么解压 rootrootrootroot-X99-Turbo:~/temp$ ll total 2916 drwx------ 3 rootroot rootroot 4096 1月 11 18:28 ./ drwxr-xr-x 25 rootroot rootroot 4096 1月…

详细分析Java中的分布式任务调度框架 XXL-Job

目录 前言1. 基本知识2. Demo3. 实战 前言 可视化任务调度 可视化配置 1. 基本知识 在Java中&#xff0c;分布式任务调度框架 XXL-Job 是一个开源的分布式任务调度平台&#xff0c;用于实现分布式系统中的定时任务调度和分布式任务执行。 下面是关于XXL-Job的一些概念、功…

05- OpenCV:图像操作和图像混合

目录 一、图像操作 1、读写图像 2、读写像素 3、修改像素值 4、Vec3b与Vec3F 5、相关的代码演示 二、图像混合 1、理论-线性混合操作 2、相关API(addWeighted) 3、代码演示&#xff08;完整的例子&#xff09; 一、图像操作 1、读写图像 &#xff08;1&#xff09;…

IDC机房服务器搬迁之运行了几年的服务器没关过机,今天关机下架,再上架突然起不来了,怎么快速处理?

环境 戴尔R420 服务器 1U 2台直连存储 4U CentOS 7 问题描述 IDC机房服务器搬迁之运行了几年的服务器没关过机,今天关机下架,再上架突然起不来了,怎么快速处理? 服务器上电开机就出现进入紧急模式 Welcome to emergency mode! After logging in, type “journalctl …

MYSQL篇--锁机制高频面试题

Mysql锁机制 1对mysql的锁有了解吗&#xff1f; 首先我们要知道&#xff0c;mysql的锁 其实是为了解决在并发事务时所导致的数据不一致问题的一种处理机制&#xff0c;也就是说 在事务的隔离级别实现中&#xff0c;就需要利用锁来解决幻读问题 然后我们可以聊到锁的分类 按锁…

软件测试|使用Python读取CSV文件的详细指南

简介 CSV&#xff08;Comma-Separated Values&#xff09;是一种常用的数据存储格式&#xff0c;它以逗号为分隔符将数据以文本形式存储在文件中。Python是一门强大的编程语言&#xff0c;提供了许多库和工具&#xff0c;使得读取和处理CSV文件变得非常简便。在本文中&#xf…

conda环境下cannot write keep file问题解决

1 问题描述 conda环境下执行如下命令报错&#xff1a; pip install githttps://github.com/wenet-e2e/wenet.git 错误信息如下&#xff1a; (pt) PS D:\code\ptcontainer> pip install githttps://github.com/wenet-e2e/wenet.git Looking in indexes: http://pypi.doub…

深度调光降压型 LED 恒流驱动器

一、产品描述 KP14612是一款PF>0.7的高精度、调光型LED恒流驱动控制芯片。适用于全范围交流输入电压的非隔离降压型LED恒流电源。KP14612支持PWM输入调光&#xff0c;最小调光深度可以达到0.1%&#xff0c;并且支持待机模式&#xff0c;待机功耗小于20mW。 ​ 二、主要特…

windows安装RabbitMq,修改数据保存位置

1、先安装Erlang&#xff0c; Erlang和RabbitMQ有版本对应关系。 官网RabbitMQ与Erlang版本对应RabbitMQ Erlang Version Requirements — RabbitMQ 2、安装RabbitMQ。 3、修改数据保存地址。找到安装目录下的sbin文件夹&#xff0c;找到rabbitmq-env.bat&#xff0c;编辑文件…

Windows和Linux安装jdk

一、Windows安装jdk 1、下载安装包 Jdk官网下载地址&#xff1a;Java Downloads | Oracle 需要登陆Oracle账号信息。 百度网盘下载地址&#xff1a;https://pan.baidu.com/s/1eN1PX6gKdKgwJ24CM0bDsw 提取码&#xff1a;4bpp 目前最新jdk的版本是21&#xff0c;可以下载不同…

SQL SERVER 19安装 SQL Prompt 10.02版本

SQL Prompt最新版官网下载地址&#xff1a;https://download.red-gate.com/SQLPromptDownload.exe 下载完成后&#xff0c;断开网络&#xff0c;全部点下一步。 注册机会报毒&#xff0c;安装前请先关闭杀毒软件&#xff01; 下载好附件之后解压&#xff0c;打开SQLPrompt_7…

深入理解 Flink(六)Flink Job 提交和 Flink Graph 详解

Flink Program 编程套路回顾 1、获取执行环境对象 StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(); 2、通过执行环境对象&#xff0c;注册数据源 Source&#xff0c;得到数据抽象 DataStream ds env.socketTextStream(...) 3、调用数…

python统计分析——小提琴图(plt.violinplot)

参考资料&#xff1a;用python动手学统计学&#xff0c;帮助文档 使用matplotlib.pyplot.violinplot()函数绘制小提琴图 小提琴图是将数值型数据的核密度图与箱线图融合在一起&#xff0c;具体来说是用核密度估计的结果替换了箱子&#xff0c;而形成的一个形似小提琴的图形。 …

openssl3.2 - 在VS2019下源码调试openssl.exe

文章目录 openssl3.2 - 在VS2019下源码调试openssl.exe概述笔记先看一个用.bat调用openssl干活的实例VS2019调试参数设置设置 - 命令参数设置 - 工作目录设置 - 环境变量将命令行中需要的文件拷贝到exe目录单步调试备注END openssl3.2 - 在VS2019下源码调试openssl.exe 概述 …

Salesforce Optimizer

Salesforce Optimizer Salesforce Optimizer是个很好的Org监控工具&#xff0c;是管理员的管理利器&#xff0c;监控内容包括&#xff1a; 多个触发器应用于同一个对象&#xff0c;这种会导致出发Apex的上限&#xff0c;在不能控制的执行顺序的情况下会给用户极差的体验&…

rknn加载onnx时报错 GLIBC=2.29 no found librknnc.so

rknn 中onnx转rknn在虚拟机中运行时发现报错. GLIBC2.29 no found /****/librknnc.so 昨天还正常的, 今天装了个ftp 和宝塔面板就出错了. 我估计根据报错地址, 找到了librknnc.so文件, 权限也给了777仍然不行 , 我怀疑是GLIBC的版本不对 ,网上给的方法是下载源码, 然后自己手动…

什么是Session以及如何在 NestJS 项目中的优雅管理 Session

前言 Web开发中一个常见的问题是用户身份的管理和状态保持。Session 就是处理这个问题的一个传统技术。在这篇文章中&#xff0c;我们将探讨Session是什么&#xff0c;为什么我们需要Session&#xff0c;以及在NestJS项目中如何优雅地管理Session。 什么是Session 众所周知&…

Java面试题之JVM

Java面试题之JVM 1. JVM的组成部分及其作用&#xff1f;2. JVM的堆和栈的区别&#xff1f;3. 简述一下垃圾回收机制&#xff1f;(垃圾回收的原理&#xff1f;)4. 垃圾回收器都有什么&#xff1f;该怎么选择&#xff1f;5. 如何判断垃圾可以回收了&#xff1f;6. 垃圾回收算法有…