代码随想录算法训练营第三十二天|1049.最后一块石头的重量II、494.目标和、474.一和零

news2024/9/25 9:32:56

1049.最后一块石头的重量II

有一堆石头,每块石头的重量都是正整数。

每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:

如果 x == y,那么两块石头都会被完全粉碎;

如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。

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

本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。目的是为了让石头分为重量相近的两堆。

1. dp[j]背包容量为j所能背的最大价值,重量等于价值。

2. 递推公式:dp[j] = max(dp[j], dp[j-stone[j]]+stone[j])

3. 初始化:dp[0]=0, 其他的值也初始化为0, dp[1500+5]=0;

4. 遍历顺序:遍历物品,再遍历背包,从大往小遍历。

5. 打印遍历

class Solution {
public:
    int lastStoneWeightII(vector<int>& stones) {
        vector<int> dp(1505,0);
        int sum = accumulate(stones.begin(), stones.end(),0);
        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]);
            }
        }
        return sum-2*dp[target];
    }
};
  • 时间复杂度:O(m × n) , m是石头总重量(准确的说是总重量的一半),n为石头块数
  • 空间复杂度:O(m)

494.目标和

给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。

返回可以使最终数组和为目标数 S 的所有添加符号的方法数。

left - right = target。left + right = sum。left - (sum - left) = target。left = (target + sum)/2。

target是固定的,sum是固定的,left就可以求出来。

此时问题就是在集合nums中找出和为left的组合。

此时问题就转化为,装满容量为x的背包,有几种方法。

1. dp[j]填满容量为j的背包有几种方法。

2. 只要搞到nums[i],凑成dp[j]就有dp[j - nums[i]] 种方法。

例如:dp[j],j 为5,

  • 已经有一个1(nums[i]) 的话,有 dp[4]种方法 凑成 容量为5的背包。
  • 已经有一个2(nums[i]) 的话,有 dp[3]种方法 凑成 容量为5的背包。
  • 已经有一个3(nums[i]) 的话,有 dp[2]种方法 凑成 容量为5的背包
  • 已经有一个4(nums[i]) 的话,有 dp[1]种方法 凑成 容量为5的背包
  • 已经有一个5 (nums[i])的话,有 dp[0]种方法 凑成 容量为5的背包
dp[j] += dp[j - nums[i]]

3. dp数组如何初始化

从递推公式可以看出,在初始化的时候dp[0] 一定要初始化为1,因为dp[0]是在公式中一切递推结果的起源,如果dp[0]是0的话,递推结果将都是0。

4. 确定遍历顺序:nums放在外循环,target在内循环,且内循环倒序

5. 举例推导dp数组

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int target) {
        int sum = accumulate(nums.begin(), nums.end(), 0);
        if((sum+target)%2==1) return 0;
        if(abs(target)>sum) return 0;
        int bagsize = (sum+target)/2;
        vector<int> dp(bagsize+1, 0);
        dp[0] = 1;
        for(int i=0; i<nums.size(); i++){
            for(int j=bagsize; j>=nums[i]; j--){
                dp[j] += dp[j-nums[i]];
            }
        }
        return dp[bagsize];
    }
};
  • 时间复杂度:O(n × m),n为正数个数,m为背包容量
  • 空间复杂度:O(m),m为背包容量

474.一和零

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

请你找出并返回 strs 的最大子集的大小,该子集中 最多 有 m 个 0 和 n 个 1 。

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

本题strs数组里的元素就是物品,m和n相当于一个背包,两个维度的背包。

本题其实是01背包问题!

只不过这个背包有两个维度,一个是m 一个是n,而不同长度的字符串就是不同大小的待装物品。

1. 确定dp[i][j]: 最多有i个0和j个1的最大子集的大小为dp[i][j]。

2. 确定递归公式:dp[i][j]可以由前一个strs里面的字符推导出来,strs字符里面有zeronum个0,有onenum个1。dp[i][j] = dp[i-zeronum][j-onenum]+1

3. 如何初始化:初始化为0

4. 确定遍历顺序:外层for循环遍历物品,内层for循环遍历背包容量且从后向前遍历。

5. 举例打印

class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        vector<vector<int>> dp(m+1, vector<int>(n+1,0));
        for(string str:strs){//对于每一个binary string我们都要考虑
            int zeronum=0, onenum=0;  
            for(char c:str){
                if(c=='1') onenum++;
                else zeronum++;
            }
            for(int i=m; i>=zeronum; i--){
                for(int j=n; j>=onenum; j--){
                    //减去zeronum和onenum是减去背包里原本有的数量,相当于减重
                    dp[i][j] = max(dp[i-zeronum][j-onenum]+1, dp[i][j]); //加1是因为多了一种方法。相当于背包里的value
                }
            }
        }
        return dp[m][n];
    }
};
  • 时间复杂度: O(kmn),k 为strs的长度
  • 空间复杂度: O(mn)

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

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

相关文章

期货交易记录20240713

文章目录 期货交易系统构建步骤一、选品二、心态历练三、何时开仓3.1、开仓纪律3.2、开仓时机3.3、开仓小技巧 四、持仓纪律五、接下来的计划 2024年7月13号&#xff0c;期货交易第5篇记录。 交易记录&#xff1a;半个月多没记录了&#xff0c;这段时间分别尝试做了菜粕、棕榈油…

9.6 栅格图层符号化唯一值着色渲染

文章目录 前言多波段彩色渲染唯一值着色QGis设置为唯一值着色二次开发代码实现唯一值着色 总结 前言 介绍栅格图层数据渲染之唯一值着色渲染说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 多波段彩色渲染唯一值着色 以“with_color_table.tif”数据为例…

【嵌入式DIY实例-ESP8266篇】-LCD ST7789显示DS1307 RTC时间数据

LCD ST7789显示DS1307 RTC时间数据 文章目录 LCD ST7789显示DS1307 RTC时间数据1、硬件准备与接线2、代码实现本文将介绍如何使用 ESP8266 NodeMCU 板和 DS1307 RTC 集成电路构建简单的实时时钟和日历 (RTCC),其中时间和日期打印在 ST7789 TFT 显示模块上。 ST7789 TFT 模块包…

Open-TeleVision——通过VR沉浸式感受人形机器人视野:兼备远程控制和深度感知能力

前言 7.3日&#xff0c;我司七月在线(集AI大模型职教、应用开发、机器人解决方案为一体的科技公司)的「大模型机器人(具身智能)线下营」群里的一学员发了《Open-TeleVision: Teleoperation with Immersive Active Visual Feedback》这篇论文的链接&#xff0c;我当时快速看了一…

UML/SysML建模工具更新情况(2024年7月)(1)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 工具最新版本&#xff1a;Enterprise Architect 17.0 BETA 更新时间&#xff1a;2024年7月2日 工具简介 性价比很高&#xff0c;目前最流行的UML建模工具。还包含需求管理、项目估算…

AIGC专栏13——ComfyUI 插件编写细节解析-以EasyAnimateV3为例

AIGC专栏13——ComfyUI 插件编写细节解析-以EasyAnimateV3为例 学习前言什么是ComfyUI相关地址汇总ComfyUIEasyAnimateV3 节点例子复杂例子-以EasyAnimateV3为例节点文件必要库的导入载入模型节点定义Image to Video节点定义节点名称映射 __init__.py文件插件导入comfyUI 学习前…

被动的机器人非线性MPC控制

MPC是一种基于数学模型的控制策略&#xff0c;它通过预测系统在未来一段时间内的行为&#xff0c;并求解优化问题来确定当前的控制输入&#xff0c;以实现期望的控制目标。对于非线性系统&#xff0c;MPC可以采用非线性模型进行预测和优化&#xff0c;这种方法被称为非线性模型…

JS实现:统计字符出现频率/计算文字在文本中的出现次数

要实现这个功能&#xff0c;JavaScript 一个非常强大的方法&#xff0c;那就是reduce() reduce() 它用于将数组的所有元素减少到一个单一的值。这个值可以是任何类型&#xff0c;包括但不限于数字、字符串、对象或数组。 reduce() 方法接收一个回调函数作为参数&#xff0c;这个…

【C++】设计一套基于C++与C#的视频播放软件

在开发一款集视频播放与丰富交互功能于一体的软件时&#xff0c;结合C的高性能与C#在界面开发上的便捷性&#xff0c;是一个高效且实用的选择。以下&#xff0c;我们将概述这样一个系统的架构设计、关键技术点以及各功能模块的详细实现思路。 一、系统架构设计 1. 架构概览 …

截图神器Snipaste

这是我作为测试这么些年来用过的最好用的截图工具&#xff0c;让你将截图贴回到屏幕上&#xff0c;最好用的截图工具&#xff0c;推荐给同事深受好评。 snipaste是一个简单但强大的截图工具&#xff0c;也可以让你将截图贴回到屏幕上。下载打开Snipaste,按下F2来开始截图&…

【已解决】sudo: apt: command not found 或者apt-get: command not found解决方案

一、问题 在CentOS7.5运行apt-get install supervisor遇到如下报错 二、原因 CentOS的软件安装工具不是apt-get &#xff0c;而是yum&#xff0c;应该使用如下命令&#xff1a; yum install supervisor 后面命令换为yum就可以了 三、扩展&#xff1a; 一般来说linux系统…

MVC架构

MVC架构 MVC架构在软件开发中通常指的是一种设计模式&#xff0c;它将应用程序分为三个主要组成部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09;。这种分层结构有助于组织代码&#xff0c;使…

AR0132AT 1/3 英寸 CMOS 数字图像传感器可提供百万像素 HDR 图像处理(器件编号包含:AR0132AT6R、AR0132AT6C)

AR0132AT 1/3 英寸 CMOS 数字图像传感器&#xff0c;带 1280H x 960V 有效像素阵列。它能在线性或高动态模式下捕捉图像&#xff0c;且带有卷帘快门读取。它包含了多种复杂的摄像功能&#xff0c;如自动曝光控制、开窗&#xff0c;以及视频和单帧模式。它适用于低光度和高动态范…

《GroupViT: Semantic Segmentation Emerges from Text Supervision》论文解读

会议&#xff1a;CVPR 年份&#xff1a;2022 代码&#xff1a;https://github.com/NVlabs/GroupViT 研究背景与动机&#xff1a; 传统深度学习系统中&#xff0c;图像区域的Grouping通常是隐式通过像素级识别标签的自上而下监督来实现的。作者提出将Grouping机制重新引入深…

本地部署,AnimeGANv3: 将现实世界照片转化为动漫风格

目录 引言 技术背景 架构与原理 实验结果与分析 应用实例 本地部署 运行结果 Photo to Hayao Style Photo to Shinkai Style more suprise 支持多种风格 结论 参考文献 GitHub - TachibanaYoshino/AnimeGANv3: Use AnimeGANv3 to make your own animation works, …

在 PostgreSQL 里如何处理数据的跨库关联查询性能优化?

文章目录 一、了解跨库关联查询的挑战&#xff08;一&#xff09;网络延迟&#xff08;二&#xff09;数据量庞大&#xff08;三&#xff09;索引不一致&#xff08;四&#xff09;数据库配置差异 二、优化策略&#xff08;一&#xff09;合理设计数据库架构&#xff08;二&…

【C++】:继承[下篇](友元静态成员菱形继承菱形虚拟继承)

目录 一&#xff0c;继承与友元二&#xff0c;继承与静态成员三&#xff0c;复杂的菱形继承及菱形虚拟继承四&#xff0c;继承的总结和反思 点击跳转上一篇文章&#xff1a; 【C】&#xff1a;继承(定义&&赋值兼容转换&&作用域&&派生类的默认成员函数…

亿康源用科技引领发展,开启大健康产业新篇章

&#xff08;本台记者报&#xff09;近日&#xff0c;杭州有一家公司凭借深厚的科技研发实力与卓越的创新能力在大健康领域屡受好评&#xff0c;其研发的新品一经推出便成为行业热议。为了探寻该公司的经营秘诀&#xff0c;我们找到了这家公司——亿康源&#xff0c;并有幸与亿…

C语言笔记34 •单链表经典算法OJ题-6.环形链表的约瑟夫问题•

环形链表的约瑟夫问题 1.问题 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数&#xff0c;报到 m 的人离开。 下一个人继续从 1 开始报数。 n-1 轮结束以后&#xff0c;只剩下一个人&#xff0c;问最后留下的这个人编号是多少&#xff1f; 数据范围&#xff1a; 1…

postman录制设置

一、前言&#xff1a; ​ postman是一个很好接口调试或是测试工具&#xff0c;简单方便&#xff0c;不需要很复杂的流程与技术&#xff0c;并且也具备录制条件。对于接口不了解&#xff0c;没有明确对应的说明&#xff0c;但又想通过接口进行一些测试使用其录制是一个不错的办…