代码随想录刷题记录 day38 最后一块石头的重量+目标和+1和0

news2024/10/7 12:22:36

代码随想录刷题记录 day38 最后一块石头的重量+目标和+1和0

参考:代码随想录

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

在这里插入图片描述

思想

把数组的石头尽可能地分成大小相等地两个集合

即sum/2;

容量为sum/2地背包尽可能地装满石头。

代码

class Solution {
    public int lastStoneWeightII(int[] stones) {
        //1.dp数组的定义
        //dp[j] 表示容量为j的背包能装的最大的重量

        //2.递推公式
        //dp[j]=Math.max(dp[j],dp[j-stones[i]]+stones[i]);

        //3.初始化 
        int [] dp=new int[1501];
        int sum=0;
        for(int stone:stones){
            sum+=stone;
        }
        //4.遍历顺序

        for(int i=0;i<stones.length;i++){
            //先遍历物品
            for(int j=sum/2;j>=stones[i];j--){
                dp[j]=Math.max(dp[j],dp[j-stones[i]]+stones[i]);
            }
        }

        return sum-dp[sum/2]-dp[sum/2];
    }
}

494. 目标和

在这里插入图片描述

思想

加号或者减号 使之成为target

​ 分解成两个集合,一个集合里面的数放加法,另外一个集合的数放减法

​ 加法集合中的总和-减法集合中的总和: left-right=target; left+right=sum

​ 由以上两个等式可得 left=(sum+target)/2 即加法集合中的和

​ 此时就转换为 0 1背包问题,把容量为left的背包装满,有多少种方法

​ 1.dp数组的定义

​ dp[j]表示 把容量为j的背包装满有dp[j]种不同的方法

​ dp[0]表示 把容量为1的背包装满有dp[0]种方法

​ dp[1]表示 把容量为1的背包装满有dp[1]种方法

​ dp[2]表示 把容量为1的背包装满有dp[2]种方法

​ dp[5]=1+dp[4]

​ 如果j=5,即背包的容量等于5

​ 当nums[i]=1时,有dp[4]种方法装备容量为5的背包

​ 当nums[i]=2时,有dp[3]种方法装备容量为5的背包

​ 当nums[i]=3时,有dp[2]种方法装备容量为5的背包

​ 当nums[i]=4时,有dp[1]种方法装备容量为5的背包

​ 当nums[i]=5时,有dp[0]种方法装备容量为5的背包

​ 2.可得递推公式

​ 可得dp[j] += dp[j - nums[i]]

​ 3.初始化:主要考虑dp[0]

​ 如果nums为[0] target=0,left=(sum+target)/2=0;

​ dp[0]=1,表示给数组里的元素 0 前面无论放加法还是减法,都是1种方法。

​ 4.遍历顺序 0 1背包的遍历顺序

代码

class Solution {
    public int findTargetSumWays(int[] nums, int target) {
        // 加号或者减号 使之成为target
        // 分解成两个集合,一个集合里面的数放加法,另外一个集合的数放减法
        // 加法集合中的总和-减法集合中的总和: left-right=target; left+right=sum
        // 由以上两个等式可得 left=(sum+target)/2 即加法集合中的和
        // 此时就转换为 0 1背包问题,把容量为left的背包装满,有多少种方法

        // 1.dp数组的定义
        // dp[j]表示 把容量为j的背包装满有dp[j]种不同的方法
        // dp[0]表示 把容量为1的背包装满有dp[0]种方法
        // dp[1]表示 把容量为1的背包装满有dp[1]种方法  
        // dp[2]表示 把容量为1的背包装满有dp[2]种方法    

        // dp[5]=1+dp[4]
        // 如果j=5,即背包的容量等于5
        // 当nums[i]=1时,有dp[4]种方法装备容量为5的背包
        // 当nums[i]=2时,有dp[3]种方法装备容量为5的背包
        // 当nums[i]=3时,有dp[2]种方法装备容量为5的背包
        // 当nums[i]=4时,有dp[1]种方法装备容量为5的背包
        // 当nums[i]=5时,有dp[0]种方法装备容量为5的背包

        // 2.可得递推公式
        // 可得dp[j] += dp[j - nums[i]]


        // 3.初始化:主要考虑dp[0]
        // 如果nums为[0] target=0,left=(sum+target)/2=0;
        // dp[0]=1,表示给数组里的元素 0 前面无论放加法还是减法,都是1种方法。


        // 4.遍历顺序 0 1背包的遍历顺序

        
        int sum=0;
        for(int num:nums){
            sum+=num;
        }
        if(sum<Math.abs(target)) return 0;
        if((sum+target)%2==1) return 0;

        int left=(sum+target)/2;

        int[] dp=new int[left+1];

        dp[0]=1;

        for(int i=0;i<nums.length;i++){
            for(int j=left;j>=nums[i];j--){
                dp[j]+= dp[j - nums[i]];
            }
        }

        for(int i=0;i<nums.length;i++){
            //System.out.println(nums[i]);
        }

        return dp[left];

    }
}

474. 一和零

在这里插入图片描述

思想

转换成0 1 背包问题 这个背包有两个维度 m个0和n个1 ,物品就是数组中的元素string

​ 1.dp[i][j]表示 容量为i个0和j个1的背包 能装的最大的子集

​ 2.递推公式

​ dp[j]=Math.max(dp[j],dp[j-weight[i]]+values[i])

​ 此题:若x表示当前物品0的个数,y表示当前物品1的个数

​ dp[i][j]=Math.max(dp[i][j],dp[i-x][j-y]+1)

​ dp[i-x][j-y]+1 表示加了当前这个元素

​ 3.初始化

​ dp[0][0]=0,因为设涉及到取最大 所以其他的也初始化成0

​ 4.遍历顺序 就是先遍历物品再遍历背包,背包倒序遍历

代码

class Solution {
    public int findMaxForm(String[] strs, int m, int n) {
        // 转换成0 1 背包问题 这个背包有两个维度 m个0和n个1  ,物品就是数组中的元素string
        // 1.dp[i][j]表示 容量为i个0和j个1的背包 能装的最大的子集

        // 2.递推公式
        // dp[j]=Math.max(dp[j],dp[j-weight[i]]+values[i])
        // 此题:若x表示当前物品0的个数,y表示当前物品1的个数
        // dp[i][j]=Math.max(dp[i][j],dp[i-x][j-y]+1)
        // dp[i-x][j-y]+1 表示加了当前这个元素

        // 3.初始化
        // dp[0][0]=0,因为设涉及到取最大 所以其他的也初始化成0

        int [][] dp=new int[m+1][n+1];
        dp[0][0]=0;

        for(String str:strs){
            //求得当前String 中包含0 和1的个数
            int x=0,y=0;
            for(int k=0;k<str.length();k++){
                if(str.charAt(k)=='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/73448.html

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

相关文章

C/C++入门002-C语言组成

文章目录1. C工程创建1.1 基于Code::Blocks创建工程1.2 Code::Blocks界面设置2. C语言程序组成2.1函数2.1.1 主函数2.1.2 其它函数2.1.3 如何执行定义好的函数2.2 输出函数printf2.2.1 编译输出为exe可执行文件2.3 C语言要求2.3.1 注释2.4 C语言程序练习2.4.1 输出三角形代码1&…

【MySQL基础】数据库定义语言DDL相关操作有那些?

目录 一、什么是DDL? 二、对数据库的常用操作 三、对表结构的常见操作 四、修改表结构格式 &#x1f49f; 创作不易&#xff0c;不妨点赞&#x1f49a;评论❤️收藏&#x1f499;一下 一、什么是DDL? DDL(Data Definition Language) 被称为数据库定义语言&#xff0c;该…

如何基于企业微信通讯录,同步生成对外的LDAP服务?

不少企业使用企业微信作为办公协同的工具&#xff0c;并通过企业微信的组织架构&#xff08;即通讯录&#xff09;来管理员工身份。那么如何利用当前企业微信的组织架构和用户身份&#xff0c;同步生成对外的 LDAP 服务呢&#xff1f; 为什么要同步创建 LDAP 服务&#xff1f; …

【超级详细步骤】pyinstaller 打包 exe 其实特别简单

文章目录为什么要打包&#xff1f;安装pyinstaller技术提升pyinstaller 打包单个.py文件步骤1&#xff1a;单击以下区域输入 cmd 切换到目标文件目录2&#xff1a;输入 pyinstaller -F -w Analog_clock.py 回车即可3&#xff1a;打包成功会在.py文件同级目录下出现以下文件&…

VM——http协议及json解析

1、http协议实现参考&#xff1a;(180条消息) C# Http通讯协议的整理_C#Code- Sheep的博客-CSDN博客_c# http协议 2、Json解析参考&#xff1a;c#解析json字符串处理&#xff08;最清晰易懂的方法&#xff09; - 轩辕箭 - 博客园 (cnblogs.com) 3、VM中http实现步骤&#xff…

WordPress 主题模板QUX9.1.4开心版无授权限制 DUX二开增强主题

源码测评&#xff1a;WordPress主题QUX9.1.4开心版&#xff0c;我安装测试了下&#xff0c;看来没什么问题&#xff0c;想学习参考的网友可以试下。 更新日志&#xff1a; 2020/3/19更新 V9.1.4 推荐&#xff1a;★★★★★ 新增 新增夜间模式&#xff08;主题设置 – 客服 –…

基于Python+Django+Vue+MYSQL的社团管理系统

项目介绍 随着近年来大学教育的改革&#xff0c;大部分高校普遍开始实行学分制、弹性学制改革&#xff0c;这样学校在学生的学习和生活中所起的作用慢慢减小&#xff0c;不再是一种直接由学校决定学生的大学生活。学生对自己的学习和生活有了更大的自主权&#xff0c;在课余也…

虹科分享 | 盘点世界杯有趣小知识!带你感受体育赛事可视化的快乐!

卡塔尔世界杯 2022年卡塔尔世界杯是第二十二届世界杯足球赛&#xff0c;是历史上首次在卡塔尔和中东国家境内举行、也是第二次在亚洲举行的世界杯足球赛。 今年卡塔尔世界杯可谓精彩纷呈&#xff0c;花2000个亿在沙漠里打造出的空调球场、洗脑又魔性的“母鸡生蛋”主题曲《Tu…

【Linux】进程创建、退出和等待(fork、exit和_exit、waitpid和wait、阻塞和非阻塞)

文章目录1、进程创建1.1 理解fork函数1.2 fork函数的细节2、进程退出2.1 退出码2.2 exit函数和_exit系统调用3、进程等待3.1 wait和waitpid3.2 阻塞和非阻塞1、进程创建 进程的创建主要依靠系统接口fork函数。 fork函数从已存在的一个进程中&#xff0c;创建一个子进程&#…

刚接触测试如何编写测试用例?看看摸鱼5年的老点工是怎么写的

给你个需求&#xff0c;你要怎么转变成最终的用例&#xff1f; 直接把需求文档翻译一下就完事了。 老点工拿到需求后的标准操作&#xff1a; 第一步&#xff1a;解析需求 先解析需求-找出所有需求中的动词&#xff0c;再列出所有测试点。测试点过程不断发散&#xff0c;对于…

第十四章: ReentrantLock、ReentrantReadWriteLock、StampedLock

相关面试题锁的演变ReentrantReadWriteLock锁降级案例演示一案例演示二总结为什么要有锁降级邮戳锁 StampedLock邮戳锁的特点案例演示一案例演示二StampedLock 缺点相关面试题 你说你用过读写锁&#xff0c;锁饥饿问题是什么&#xff1f;有没有比读写锁更快的锁&#xff1f;St…

域名解析函数 gethostbyname

在实现TCP/UDP编程的时候&#xff0c;服务端绑定的IP地址是点分十进制的&#xff0c;如124.222.215.205&#xff0c;如果提供的是域名&#xff0c;此时我们需要将域名转换成点分十进制的IP地址&#xff0c;这个过程就是 “ 域名解析 ”&#xff0c;实现域名转换的函数就是 geth…

Python Aws Ubuntu20 配置多IP

1. 业务场景&#xff1a; 高频次交易需要多次访问接口&#xff0c;配置单服务器多IP绕过币安单个IP频率限制 2. AWS实例选择&#xff1a; t3系列&#xff0c;东京A区&#xff0c;ubuntu20 这是我测试的币安延迟最低的配置&#xff08;平均6ms&#xff09; 换一个区域、一个系…

【王道计算机网络笔记】数据链路层-数据链路层设备

文章目录物理层扩展以太网链路层扩展以太网网桥透明网桥源路由网桥以太网交换机直通式交换机存储转发式交换机冲突域和广播域物理层扩展以太网 主机和集线器不能超过100m&#xff0c;超过100m会失真严重&#xff0c;无法恢复&#xff0c;扩展以太网的方法&#xff1a; 通过光纤…

欢迎报名Rust China Hackathon 2022 达坦科技组

12月4日下午&#xff0c;DatenLord就2022Rust China Hackathon大赛活动企业组&#xff08;达坦科技组&#xff09;的赛题进行了空中宣讲会。不仅对赛事流程进行了全面的讲解&#xff0c;同时对赛题背景以及完赛标准和要点进行了深入的剖析。会后更是设置问答环节&#xff0c;细…

目标检测算法——图像分割数据集汇总(附下载链接)

>>>深度学习Tricks&#xff0c;第一时间送达<<< &#x1f384;&#x1f384;近期&#xff0c;小海带在空闲之余&#xff0c;收集整理了一批图像分割数据集供大家参考。 整理不易&#xff0c;小伙伴们记得一键三连喔&#xff01;&#xff01;&#xff01;&am…

给visCode编辑器添加背景图

看见很多大牛的visCode编辑器上有个背景图&#xff0c;感觉挺有逼格的&#xff0c;要想跟大牛一样有逼格&#xff0c;那先把编辑器设置的跟大牛的逼格一样高 话不多说&#xff0c;开始 第一步&#xff1a;先安装背景扩展 第二步&#xff1a;点击选择扩展设置 第三步&#xff1…

原码、反码、补码的互相转换

原码、反码、补码的互相转换 简介&#xff1a;本文是为了计算机组成原理复习&#xff0c;本文以具体题目的方式来对原码、反码、补码的互相转换进行讲解。 概述 原码 &#xff1a;最高位是符号位&#xff0c;0代表正数&#xff0c;1代表负数&#xff0c;非符号位为该数字绝对…

实战web漏洞挖掘小技巧

几个月前看到国外的bug bounty tips在传Host攻击技巧&#xff0c;前阵子又看到国内有不少文章总结&#xff0c;冷渗透就不再复述了&#xff0c;直接介绍实际业务场景中碰到的案例。 0x01 自定义Host—窃取Token 1. 找到重置密码处&#xff0c;填写任意一个受害者邮箱帐号&#…

记录--微信小程序获取用户信息(附代码、流程图)

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 本篇文章主要总结了微信小程序开发&#xff0c;获取用户信息的整个流程步骤。补充了网上很多碎片化的代码&#xff0c;本人梳理了思路写下了这篇文章。 思路 1、在js文件中&#xff0c;设置userinfo、…