代码随想录算法训练营 Day 43 | 1049.最后一块石头的重量 II,494.目标和,474.一和零

news2024/12/27 13:50:12

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

讲解链接:代码随想录-1049.最后一块石头的重量 II

  1. 确定 dp 数组以及下标的含义:dp[j]表示容量(这里说容量更形象,其实就是重量)为 j 的背包,最多可以背最大重量为 dp[j]。
    石头的重量是 stones[i],石头的价值也是 stones[i] ,可以 “最多可以装的价值为 dp[j]” == “最多可以背的重量为 dp[j]”
  2. 确定递推公式:dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);
  3. dp 数组如何初始化:既然 dp[j]中的 j 表示容量,那么最大容量(重量)是多少呢,就是所有石头的重量和。而我们要求的 target 其实只是最大重量的一半。计算出石头总重量 然后除 2,得到 dp 数组的大小。
  4. 确定遍历顺序:物品遍历的 for 循环放在外层,遍历背包的 for 循环放在内层,且内层 for 循环倒序遍历!
  5. 举例推导 dp 数组:举例,输入:[2,4,1,1],此时 target = (2 + 4 + 1 + 1)/2 = 4 ,dp 数组状态图如下:
    在这里插入图片描述
public int lastStoneWeightII(int[] stones) {
    int sum = Arrays.stream(stones).sum();
    int target = sum / 2;
    int[] dp = new int[target + 1];

    for (int i = 0; i < stones.length; i++) {
        for (int j = target; j >= stones[i]; j--) {
            dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]);
        }
    }
    return sum - dp[target] - dp[target];
}

494.目标和

讲解链接:代码随想录-494.目标和

动态规划-01 背包

我们可以把集合分成两个,一个用来存放正数的,一个用来存放负数的。

正数集合和 减去 负数集合和 = 目标值。那么 正数集合和 = (目标值 + 总集合和) / 2; 推导过程就不放在这里了。

此时我们只需要让集合中的数可以凑出正数集合和,就说明是一种方法。

  1. 确定 dp 数组以及下标的含义:dp[j] 表示:填满 j(包括 j)这么大容积的包,有 dp[j]种方法

  2. 确定递推公式: 只要搞到 nums[i],凑成 dp[j]就有 dp[j - nums[i]] 种方法。

    1. 举例:nums : [1, 2, 3, 4, 5] ; target : 5 。
    2. 解释:这里 dp 的数组长度为 11,下标到 10,说明只有正数集合和为 10 的时候,才能满足目标值。所以 dp[10] 的值就是集合中的数能组成和为 10 的组合数量。
    3. 打印 :
    4.                   dp下标	 0,1,2,3,4,5,6,7,8,9,10
       i : 0, nums[i] : 1, dp : [1,1,0,0,0,0,0,0,0,0,0] 因为nums[0] = 1,所以这个集合和等于 1 的组合只有 1 种,所以 dp[1] = 1;
       i : 1, nums[i] : 2, dp : [1,1,1,1,0,0,0,0,0,0,0] nums[1] = 2,此时能组成 2 的组合有 1 种,和为 3 的集合有 1 种[1,2]。所以 dp[2] = 1, dp[3] = 1。
       i : 2, nums[i] : 3, dp : [1,1,1,2,1,1,1,0,0,0,0] nums[2] = 3,此时组成 3 的组合多了 1 种,最大能组成的和到 6。
       i : 3, nums[i] : 4, dp : [1,1,1,2,2,2,2,2,1,1,1] 下面依次类推。
       i : 4, nums[i] : 5, dp : [1,1,1,2,2,3,3,3,3,3,3]
      
    5. 上面的举例主要验证了公式和的正确性,那么为什么递推公式是:dp[j] += dp[j - nums[i]];
    6. 当背包容量(集合和)为 10 的时候,当前物品的价值为 4 时,我们有的组合就是:背包容量为 6 的组合数。
      当背包容量(集合和)为 10 的时候,当前物品的价值为 5 时,我们有的组合就是:背包容量为 5 的组合数 加上 之前已经得到的组合数。
public int findTargetSumWays(int[] nums, int target) {
    int sum = Arrays.stream(nums).sum();
    if ((target + sum) % 2 == 1 || Math.abs(target) > sum) {
        return 0; // 此时没有方案
    }
    int bagSize = (target + sum) / 2;
    int[] dp = new int[bagSize + 1];
    dp[0] = 1;
    for (int i = 0; i < nums.length; i++) {
        for (int j = bagSize; j >= nums[i]; j--) {
            dp[j] += dp[j - nums[i]];
        }
    }
    return dp[bagSize];
}

回溯算法(会超时)

提示回溯,但是用回溯会超时,这个回溯方法可以只求正数集合和来简化一下。

class FindTargetSumWays {
    public static void main(String[] args) {
        int[] num = ArrayUtils.initArray(0, 0, 0, 0, 0, 0, 0, 0, 1);
        int target = 1;
        int targetSumWays = new FindTargetSumWays().findTargetSumWays(num, target);
        System.out.println(targetSumWays);
    }


    Integer count = 0;

    public int findTargetSumWays(int[] nums, int target) {
        backtracking(nums, target, 0, new ArrayList<>());
        return count;
    }

    void backtracking(int[] nums, int target, int start, List<Integer> paths) {
        if (paths.size() == nums.length) {
            if (paths.stream().reduce(Integer::sum).get() == target) {
                count++;
            }
            return;
        }
        for (int i = start; i < nums.length; i++) {
            paths.add(nums[i]);
            backtracking(nums, target, i + 1, paths);
            paths.remove(paths.size() - 1);
            paths.add(-nums[i]);
            backtracking(nums, target, i + 1, paths);
            paths.remove(paths.size() - 1);
        }
    }
}

474.一和零

讲解链接:代码随想录-474.一和零

  1. 确定 dp 数组以及下标的含义:dp[i][j]:最多有 i 个 0 和 j 个 1 的 strs 的最大子集的大小为 dp[i][j]。
  2. 确定递推公式:dp[i][j] 可以由前一个 strs 里的字符串推导出来,strs 里的字符串有 zeroNum 个 0,oneNum 个 1。dp[i][j] 就可以是 dp[i - zeroNum][j - oneNum] + 1。然后我们在遍历的过程中,取 dp[i][j] 的最大值。
    所以递推公式:dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);
public int findMaxForm(String[] strs, int m, int n) {
    int[][] dp = new int[m + 1][n + 1];
    for (String str : strs) {
        int zeroNum = 0;
        int oneNum = 0;
        for (char c : str.toCharArray()) {
            if (c == '0') zeroNum++;
            else oneNum++;
        }

        for (int i = m; i >= zeroNum; i--) {
            for (int j = n; j >= oneNum; j--) {
                dp[i][j] = Math.max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);
            }
        }
    }
    return dp[m][n];
}

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

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

相关文章

XPath语法:在XML文档中定位和选择节点的利器

XPath&#xff08;XML Path Language&#xff09;是一种用于在XML文档中定位和选择节点的语言。它提供了强大的定位和选择能力&#xff0c;使开发人员能够准确、灵活地定位所需的元素。本篇博客将介绍XPath的语法和常用定位方法&#xff0c;帮助你在Web自动化测试等场景中更好地…

Glob 文件匹配

前言 glob本质是Unix shell 风格的路径匹配规则。 该规则后续被其它语言支持。 ?&#xff1a;匹配一个任意字符 *&#xff1a;匹配任意个任意字符 [sequence]&#xff1a;匹配出现在sequence里面的一个字符 [!sequence]&#xff1a;匹配没有出现在sequence里面的一个字符 [a…

【解决】CSS下拉菜单不会显示的问题

导航栏的下拉菜单显示&#xff0c;但按 F5 刷新的一瞬间又能看见 下拉菜单的内容&#xff0c;但就是不会显示出来&#xff0c;一开始以为是 js 代码写错或者 css 的动画函数的影响&#xff0c;后面找到一篇博客&#xff0c;说这是老生常谈的问题&#xff0c;对于小白确实很难找…

移动应用数据安全性:如何防止应用程序被黑客攻击和数据泄露?

第一章&#xff1a;引言 在移动应用成为人们生活中不可或缺的一部分的今天&#xff0c;数据安全性已经成为一个非常重要的问题。随着黑客攻击和数据泄露事件的频繁发生&#xff0c;用户对于移动应用程序的信任度也在逐渐下降。本文将探讨移动应用数据安全性的重要性&#xff0…

chatgpt赋能Python-pythongpu加速

Python GPU加速&#xff1a;让你的Python应用飞速运行 介绍 Python是一种高级编程语言&#xff0c;具有易于学习、易于使用和强大的功能。作为一门解释型语言&#xff0c;Python会在运行时逐行解释程序代码&#xff0c;而这种解释方式会导致Python在运行速度上较慢。在需要大…

2023上半年软考系统分析师科目一整理-01

2023上半年软考系统分析师科目一整理-01 1. 面向对象2. UML 1. 面向对象 面向对象分析中&#xff0c;对象是类的实例。对象的构成成分包含了&#xff08;A&#xff09;&#xff0c;属性和方法&#xff08;或操作&#xff09;。 A.标识 B.消息 C.规则 D.结构 对象的三要素为&am…

linux服务器安装python环境配置

linux服务器安装python环境配置 服务器跳板机服务器配置配置anaconda环境安装其他python版本卸载anaconda root用户为用户添加权限其他工具Jupyter Noetbooktmux 服务器跳板机 跳板机是一个可以从公共网络访问的服务器&#xff0c;它允许用户通过 SSH 连接进入私有网络中的其他…

AI绘画-Midjourney基础2-创意之旅启航:超强二次元风格模型 niji 5

niji 模型是 mj 的一种模型&#xff0c;可以生成二次元风格的图片。 在控制台输入 /settings 指令&#xff0c;进入设置页面。 选择第二行的 Niji version 5 模型&#xff0c;就可以创作二次元风格的图片了&#xff01; niji 5 模型还有 expressive、cute、scenic 3种风格可以…

【C++初阶】类与对象(中)之取地址及const取地址操作符重载(了解即可)

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

chatgpt赋能Python-pythongroup

PythonGroup&#xff1a;提高Python技能和构建社交网络的绝佳平台 PythonGroup是一家致力于为Python编程者提供高质量资源和社交网络的平台。无论您是新手还是有十年以上的经验&#xff0c;PythonGroup都可以帮助您提高您的技能&#xff0c;增加您的知识和职业发展机会。 Pyt…

t检验与Z检验的区别

在统计学中&#xff0c;假设检验是评估某种特定情况下观察到的数据是否符合假设的一种方法。t检验和Z检验是两种常用的假设检验方法&#xff0c;分别用于比较均值差异以及比例差异。在医学统计中&#xff0c;t检验和Z检验经常被用于研究和比较不同治疗方法的效果&#xff0c;例…

chatgpt赋能Python-pythonfor遍历列表

Python for循环&#xff1a;遍历列表 - 提高您的编程技能 列表是Python编程语言中广泛使用的数据结构。在许多情况下&#xff0c;我们需要遍历列表中的元素。Python中的for循环是一种最常用的遍历列表的方式。在本文中&#xff0c;我们将介绍如何使用Python的for循环语句遍历列…

SSRS rdlc报表之创建报表 一

环境 vs2019 fromwork4.5 第一步 安装rdlc报表插件 vs2019使用rdlc&#xff0c;需要安装扩展插件&#xff0c;扩展→扩展管理→联机&#xff0c;搜索rdlc&#xff0c;安装Microsoft RDLC Report Designer&#xff0c;我在安装过程中&#xff0c;安装了很久都没安装成功&…

一、数据字典介绍

文章目录 一、数据字典介绍1、页面效果2、表设计3、数据分析4、根据页面效果分析数据接口 一、数据字典介绍 何为数据字典&#xff1f;数据字典就是管理系统常用的分类数据或者一些固定数据&#xff0c;例如&#xff1a;省市区三级联动数据、民族数据、行业数据、学历数据等&a…

Spring Boot系列(一):Spring Boot 入门篇

目录 对于学习Java的童鞋来说&#xff0c;可都是有用的博文&#xff0c;也是我悉心选择推荐给大家的。这次为大家带来的系列文章是关于Spring Boot的&#xff0c;Spring Boot对Javaer来说应该是很常用的一个框架。希望这个系列能对大家有用&#xff01;​编辑 快速入门 总结 …

C语言的位运算

1. 位操作符综述 位操作有逻辑运算和移位运算&#xff0c;如位与、位或、位取反、按位异或、移位等操作。位运算通常会和底层代码寄存器的操作结合在一起使用&#xff0c;比如想要让寄存器中的任意1位或者任意几位位设置为1&#xff0c;或者设置为0&#xff0c;从而实现对寄存…

chatgpt赋能Python-pythongame怎么样

Python Game&#xff1a;打造属于自己的游戏 Python是一种全球流行的编程语言&#xff0c;因其简洁易懂、高效稳定&#xff0c;被广泛应用于各类软件、网站与游戏的开发领域。其中&#xff0c;Python Game成为许多开发者的关注焦点&#xff0c;不同于传统游戏开发的复杂与繁琐…

【音视频开发】摄像头和ISP的基本介绍

文章目录 一、摄像头的基本知识1.1 摄像头结构1.2 摄像头模组的种类1.3 摄像头的工作原理 二、Sensor的基本知识2.1 Sensor的工作原理2.2 Sensor的分类2.3 Sensor的封装形式2.4 常见的Sensor厂商2.5 Sensor的基本框图 三、ISP的基本知识3.1 ISP的定义3.2 ISP的工作原理 四、ISP…

拥抱生成式大模型 --- 提示工程篇

本文为系列的第二篇&#xff0c;主要是学习和总结chatgpt类模型的提示工程。感谢吴恩达老师的开源课程。 引言 随着大型语言模型&#xff08;LLM&#xff09;的发展&#xff0c;LLM 大致可以分为两种类型&#xff0c;即基础LLM和指令微调LLM。基础LLM是基于文本训练数据&…

栈和队列 - C语言实现

目录 栈 栈的概念 栈的实现 队列 队列的概念 队列的实现 栈 栈的概念 栈是一种后进先出 (LIFO - last in first out) 的数据结构&#xff0c;通常利用数组或链表实现。栈只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另…