C++ day43 最后一块石头的重量 目标和 一和零

题目1:1049 最后一块石头的重量

题目链接:最后一块石头的重量

对题目的理解

整数数组stone[i]表示第i块石头的重量,每次从中选出任意两块石头(x<=y)粉碎

如果两块石头重量相等,就会被完全粉碎;如果不等,那么重量轻(x)的石头会被粉碎,另一块石头重量变为y-x

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

stone数组中的元素在1~100之间,数组长度在1~30之间

每次让数值相近的石头一起粉碎,这样最终得到的重量会减少,本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了

本题物品的重量是stones[i],物品的价值也是stones[i]

动规五部曲

1)dp数组的含义及下标i的含义

dp[j]:表示背包容量为j背的最大价值,

本题表示背包中容量是j时,最大重量是dp[j]

2)递推公式

01背包:dp[j]=max(dp[j],dp[j-weight[i]]+value[i])

dp[j]=max(dp[j],dp[j-stones[i]]+stones[i])

3)dp数组初始化

dp[0]=0  ,根据递推公式,非零下标对应的dp[j]也初始化为0,这样才不会覆盖初始值

1 <= stones.length <= 30,1 <= stones[i] <= 100,所以最大重量就是30 * 100 ,但是背包只需要装最大重量的一半即可(因为将石头分成重量相等的两堆),target=sum/2=3000/2=1500

4)遍历顺序

先正序遍历物品,后倒序遍历背包

for(i=0;i<stones.size();i++){

      for(j=target;j>=stones[i];j--)}

5)打印dp数组

最后dp[target]里是容量为target的背包所能背的最大重量,那么分成两堆石头,一堆石头的总重量是dp[target],另一堆就是sum - dp[target],

因为target=sum/2,是直接抹去小数部分,所以sum-dp[target]>=target

最终石头的最小重量是result=(sum-dp[target])-dp[target]

代码

class Solution {
public:int lastStoneWeightII(vector<int>& stones) {//数组长度最大是30,数组中的元素最大是100,所以dp数组承受的最大重量是30*100=3000,分成重量相同的两堆,所以大小是1500+1//dp数组初始化vector<int> dp(1501,0);int sum = 0;for(int i=0;i<stones.size();i++){sum += stones[i];}int target = sum/2;//递推,先正序遍历物品,后倒序遍历背包for(int i=0;i<stones.size();i++){for(int j=target;j>=stones[i];j--){dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);}}int result = sum-dp[target]-dp[target];return result;}
};
  • 时间复杂度:O(m × n) , m是石头总重量(准确的说是总重量的一半),n为石头块数
  • 空间复杂度:O(m)

题目2:494 目标和

题目链接:目标和

对题目的理解

非负整数数组的每个数字前添加   '+'   或  '-' 得到表达式,计算表达式运算结果等于target的不同表达式的数目

本题还是分成两个部分,加法集合left    减法集合right,这两个集合满足下面的两个等式①②

①  left+right=sum

②  left-right=target

right=sum-left

left-(sum-left)=target-->2left-sum=taget   left=(target+sum)/2     注:只有能整除才能找到

如果不能整除,则不存在这样的元素组合使得运算结果等于target,

如果target的绝对值的大于sum,也是无解的

背包容量是left时,看元素中有多少种方式能够装满这个背包,每个元素只用1次,是01背包问题

动规五部曲

1)dp[j]数组即下标j的含义

背包容量为j时,装满背包有dp[j]种方法

2)递推公式   

递推公式:dp[j] += dp[j-nums[i]]      ,在后面在讲解背包解决排列组合问题的时候还会用到!

3)dp数组初始化

dp[0]=1,如果数组[0] ,target = 0,那么 left = (target + sum) / 2 = 0, dp[0]也应该是1, 也就是说给数组里的元素 0 前面无论放加法还是减法,都是 1 种方法。

根据递推公式 因为递推公式是累加的,dp[j]要保证是0的初始值,才能正确的由dp[j - nums[i]]推导出来。,所以非零下标的dp[j]初始为0

4)遍历顺序

01背包:正序遍历物品(元素),倒序遍历背包(left)

5)打印dp数组

代码

class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {int sum=0;for(int i=0;i<nums.size();i++){sum += nums[i];}int left = (target+sum)/2;//dp数组里面尽可能地装left容量   -500~1000if((target+sum)%2==1) return 0;if(abs(target)>sum) return 0;//初始化dp数组vector<int> dp(left+1,0);dp[0]=1;//递推for(int i=0;i<nums.size();i++){for(int j=left;j>=nums[i];j--){dp[j] += dp[j-nums[i]];}}return dp[left];}
};
  • 时间复杂度:O(n × m),n为正数个数,m为背包容量
  • 空间复杂度:O(m),m为背包容量

本题记住:装满背包有几种方法,递推公式为

dp[j] += dp[j-nums[i]];

题目3:474一和零

题目链接:一和零

对题目的理解

返回二进制字符串数组strs最大子集长度,该子集中最多有m个0和n个1,二进制字符串仅由0,1组成

题目要求:strs字符串数组中至少有1个字符串,最多有600个字符串;每个字符串的长度至少为1,最多是100

背包有两个维度,m个0和n个1,装满这个背包有多少个物品

不同长度的字符串就是不同大小的待装物品,每个物品只能使用1次,所以是01背包问题

动规五部曲

1)dp数组及下标i的含义

二维dp数组,dp[i][j]  装满i个0,j个1的背包最多背了dp[i][j]个物品

2)递推公式

01背包递推公式:dp[j]=max(dp[j],dp[j-weight[i]]+value[i])

每个物品的重量是x个0,y个1,是两个维度,所以递推公式为dp[i][j]=max(dp[i][j], dp[i-x][j-y]+1)

3)dp数组初始化

dp[0][0]=0   非零下标 ,若初始化为一个较大的正整数,那么根据递推公式,值会被覆盖掉

所以非零下标的dp[j]也初始化为非负整数的最小值,即0

4)遍历顺序

01背包:先正序遍历物品strs里的字符串,后倒序遍历背包(两个维度,m和n)

5)打印dp数组

代码

class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {//定义并初始化dp数组,这个数组是一个二维数组,有这两个重量0和1vector<vector<int>> dp(m+1,vector<int>(n+1,0));//递推,先正序遍历物品,后倒序遍历背包for(string str:strs){//遍历物品(字符串数组)int x=0;//记录当前字符串中0的个数int y=0;//记录当前字符串中1的个数for(char c:str){//遍历字符串中的每个字符,统计字符串中0和1的数量if(c=='0') x++;else y++;}        for(int i=m;i>=x;i--){//遍历背包for(int j=n;j>=y;j--){dp[i][j]=max(dp[i][j],dp[i-x][j-y]+1);}}}return dp[m][n];}
};
  • 时间复杂度: O(kmn),k 为strs的长度
  • 空间复杂度: O(mn)

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

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

相关文章

智能井盖位移报警器效果一览,感知井盖异常

井盖位移是指井盖在受到外力作用下产生的位置移动。这种现象通常发生在道路颠簸、车流量较大或地下管道受压较大的区域&#xff0c;当然也不排除会出现在一些角落内。当井盖发生位移或倾斜时&#xff0c;不仅会影响城市内道路的通行&#xff0c;还会给行人和车辆带来安全隐患。…

设计模式详解(三):工厂方法

目录导航 抽象工厂及其作用工厂方法的好处工厂方法的实现关系图实现步骤 工厂方法的适用场景工厂方法举例 抽象工厂及其作用 工厂方法是一种创建型设计模式。所谓创建型设计模式是说针对创建对象方面的设计模式。在面向对象的编程语言里&#xff0c;我们通过对象间的相互协作&…

零基础搭建本地Nextcloud私有云结合内网穿透实现远程访问

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;摘要一. 环境搭建二. 测试局域网访问三. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建…

市面上这么多SD-WAN服务商,究竟有何不同?

随着数字化浪潮的不断发展&#xff0c;企业网络已经成为了现代企业中不可缺少的一部分。而提供企业组网服务的SD-WAN服务商也呈现出快速增长的趋势。但是&#xff0c;市场上有这么多SD-WAN服务商&#xff0c;各个服务商技术实现方案非常相似&#xff0c;那么这些服务商之间到底…

将360调配成绿色无弹窗软件

相信很多小伙伴都跟我一样喜欢杀毒软件的功能。而小编认为最好用的杀毒软件就是360了。360功能齐全&#xff0c;界面美观&#xff0c;但总是有很多弹窗小广告&#xff0c;怎么办呢&#xff1f; 今天就来就来教大家如何将360设置为绿色无弹窗软件 将360调配成绿色无弹窗软件 一…

loading...字符变化动画

公司业务一个简单的需求loading...文字动画&#xff0c;不想用js实现&#xff0c;问过GPT后学习了css写法 效果预览 代码实现 keyframes text-change {0% { content: "."; }33% { content: ".."; }66% { content: "..."; }}.text_loading_anima…

U-GAT-IT 使用指南

U-GAT-IT 使用指南 网络结构优化目标 论文地址&#xff1a;https://arxiv.org/pdf/1907.10830.pdf 项目代码&#xff1a;https://github.com/taki0112/UGATIT U-GAT-IT 和 Pix2Pix 的区别&#xff1a; U-GAT-IT&#xff1a;主要应用于图像风格转换、图像翻译和图像增强等任务…

【PyQt】QPixmap与numpy.array互转

这里给出QPixmap→numpy.ndarray的两条转换(一个是使用PIL.Image而另一个不用)&#xff0c; 以及numpy.ndarray→QPixmap两条转换(同样也是用不用PIL.Image的区别)。 代码运行结果&#xff1a; from PyQt5.QtCore import QPoint,QRect,Qt from PyQt5.QtWidgets import QLabel …

多线程05

前言 前面我们说到了死锁以及线程可见性的问题 我们将线程可见性主要归结于是JVM自身的一个bug 一个线程写一个线程读 会将一直不变的变量优化到直接从寄存器中读取,而不是缓存等读取,因为这样我们就设置了使用volatile关键字使得用到这个变量的时候必须从内存中读取数据 死锁主…

vscode集成git

1、首先电脑要安装git 打开git官网地址&#xff1a;Git进行下载&#xff0c;如下图界面&#xff1a; 如图片中描述&#xff1a;一般进入官网后会识别电脑对应系统&#xff08;识别出了我的电脑是Windows系统 。如果未识别到电脑系统&#xff0c;可在左侧选择自己电脑对应的系统…

【yolov5人行道-斑马线目标检测】

yolov5人行道-斑马线目标检测 数据集yolov5人行道-斑马线目标检测检测模型 数据集 YOLOv5是一种目标检测算法&#xff0c;可以用于检测图像中的人行道-斑马线。在目标检测领域&#xff0c;YOLOv5通过结合多种技术手段&#xff0c;包括使用Mosaic数据增强操作、自适应锚框计算与…

方差分析(F检验)用于特征选择的Python实现

方差分析&#xff08;F检验&#xff09;又称ANOVA&#xff0c;方差齐性检验&#xff0c;是一种用来捕捉每个特征变量与响应变量之间线性关系的过滤方法&#xff0c;实现路径是针对两个及两个以上分组的样本均值进行差异显著性检验&#xff0c;基本思想是将不同分组的样本均值之…