当前位置: 首页 > news >正文

备战秋招012(20230808)

文章目录

  • 前言
  • 一、今天学习了什么?
  • 二、动态规划
    • 1.概念
    • 2.题目
  • 总结


前言

提示:这里为每天自己的学习内容心情总结;

Learn By Doing,Now or Never,Writing is organized thinking.


提示:以下是本篇文章正文内容

一、今天学习了什么?

  • 学习了代码随想录关于动态规划的算法;
  • 还有01背包问题

二、动态规划

1.概念

「动态规划」(Dynamic Programming),适用于很多重叠子问题的场景**,每一个结果一定是由于上一个状态推导出来的,选择和状态转移**。解题步骤如下:

  • 确定dp数组(dp table)以及下标的含义;
  • 确定递推公式;
  • dp数组如何初始化;
  • 确定遍历顺序;
  • 举例推导dp数组;

01 背包问题」是指,有 n 个物品和一个最多能背负 w 重量的背包,求该背包能背负的最大重量。第 i 个物品的重量为 weight[i] ,价值为 value[i] 。

有两种解法:

  • 二维数组:
    • dp[i] [j] ,表示从下标为 [0,i] 的物品中,放进背包容量为 j 时的最大价值;
    • 确定遍历的顺序,先遍历背包容量,再去逐个遍历物品个数;
  • 一维数组:
    • dp[i] ,表示背包容量为 i 时的背包最大价值;
    • 先遍历物品,再去遍历背包容量,并且保证遍历背包容量时是从大到小的,保证物品只会被放入了一次。
    /*** - 采用二维数组解决背包问题* - 只有当当前背包的容量能放下当前物品的重量时,才需要去判断是否需要将物品放入背包中* - 按照先遍历物品,再去遍历背包容量的顺序执行*/public static int testWeightBagProblem01(int[] weight, int[] value, int bagSize) {int m = weight.length;int[][] dp = new int[m][bagSize + 1];for (int j = weight[0]; j <= bagSize; j++) {dp[0][j] = value[0];}for (int j = 1; j <= bagSize; j++) {for (int i = 1; i < m; i++) {if (j >= weight[i]) {dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);} else {dp[i][j] = dp[i - 1][j];}}}return dp[m - 1][bagSize];}/*** - 一维数组* - 背包容量的最大值取决于之前背包容量更小时候的最大值*/public static int testWeightBagProblem02(int[] weight, int[] value, int bagSize) {int[] dp = new int[bagSize + 1];for (int i = 0; i < weight.length; i++) {// 先遍历物品for (int j = bagSize; j >= weight[i]; j--) {// 再去遍历背包容量// 判断将此物品放入背包的结果dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]); //不放、放}}return dp[bagSize];}

2.题目

  • 509. 斐波那契数
    public int fib(int n) {if (n == 0 || n == 1) {return n;}/*** 动态规划* - dp数组* - 选择* - 状态转移* dp[i] 代表f(n)*/int[] dp = new int[n + 3];dp[0] = 0;dp[1] = 1;for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];}
  • 70. 爬楼梯
    public int climbStairs(int n) {if (n == 1 || n == 2) {return n;}/*** 遇到重叠子问题,采用动态规划* - dp数组含义:dp[i]表示有dp[i]种方法可以爬到楼顶(楼顶的台阶数为i)* - 初始化* - 状态转移和选择*/int[] dp = new int[n + 1];dp[1] = 1;dp[2] = 2;for (int i = 3; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];}
  • 746. 使用最小花费爬楼梯
    public int minCostClimbingStairs(int[] cost) {/*** - 采用动态规划* - dp[i]:爬上i层使用的最少的花费*/int[] dp = new int[cost.length + 1];for (int i = 2; i <= cost.length; i++) {dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);}return dp[cost.length];}
  • 62. 不同路径
    public int uniquePaths(int m, int n) {/*** - 每次都需要选择,采用动态规划* - dp[i][j]:到达(i,j)点的路径*/int[][] dp = new int[m][n];for (int i = 0; i < m; i++) {dp[i][0] = 1;}for (int j = 0; j < n; j++) {dp[0][j] = 1;}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m - 1][n - 1];}
  • 63. 不同路径 II
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {/*** 还是使用动态规划,只不过需要判断是否可达*/int m = obstacleGrid.length;int n = obstacleGrid[0].length;int[][] dp = new int[m][n];for (int i = 0; i < m; i++) {if (obstacleGrid[i][0] == 1) {break;}dp[i][0] = 1;}for (int j = 0; j < n; j++) {if (obstacleGrid[0][j] == 1) {break;}dp[0][j] = 1;}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (obstacleGrid[i][j] == 1) {continue;}dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m - 1][n - 1];}
  • 343. 整数拆分
    public int integerBreak(int n) {if (n <= 3) {return n - 1;}/*** - 如何使用动态规划呢?* - 就需要从怎么拆入手* - 是否要拆,取决于拆完后结果和之前的结果谁更大*/int[] dp = new int[n + 1];dp[2] = 1;for (int i = 3; i <= n; i++) {for (int j = 1; j <= i - j; j++) {dp[i] = Math.max(dp[i], Math.max((i - j) * j, dp[i - j] * j));}}return dp[n];}public int integerBreak2(int n) {if (n <= 3) {return n - 1;}/*** - 这是纯数学解答* - 任何整数都可以拆成2和3* - 怎么拆,取决于模上3的余数是多少*/int remainder = n % 3;int times = n / 3;if (remainder == 0) {return (int) Math.pow(3, times);} else if (remainder == 1) {return (int) Math.pow(3, times - 1) * 4;} else {return (int) Math.pow(3, times) * 2;}}
  • 96. 不同的二叉搜索树(⭐⭐⭐⭐⭐)

这个题有点难,在于如何的合适区拆分成子问题:

应该先举几个例子,画画图,看看有没有什么规律,如图:

  • n = 1 , 2 时都很直观;
  • n = 3 时,分为:
    • 当1为头结点的时候,其右子树有两个节点,看这两个节点的布局,是不是和 n 为2的时候两棵树的布局是一样的啊!
    • 当2为头结点的时候,其左右子树都只有一个节点,布局是不是和n为1的时候只有一棵树的布局也是一样的啊!
    • 当3为头结点的时候,其左子树有两个节点,看这两个节点的布局,是不是和n为2的时候两棵树的布局也是一样的啊!
    • dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量;
      • dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2];
      • 元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量;
      • 元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量;
      • 元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量;
96.不同的二叉搜索树

96.不同的二叉搜索树2

    public int numTrees(int n) {/*** - 这个题有点难,在于如何正确的处理拆分子问题* - dp[i],代表i个节点组成的二叉搜索树的种数* - 拆分为 1.2.3.....i 为头节点组成的二叉搜索树的之和就是i个节点组成的二叉搜索树的种数*/int[] dp = new int[n + 1];dp[0] = 1;dp[1] = 1;for (int i = 2; i <= n; i++) {for (int j = 1; j <= i; j++) {dp[i] += dp[i - j] * dp[j - 1];}}return dp[n];}
  • 416. 分割等和子集(⭐⭐⭐)
    public boolean canPartition(int[] nums) {/*** - 可以将问题看成,是否能将数组中的元素凑出数组元素和的一半* - 背包容量为一半的数组和,物品价值和物品重量都是nums数组* - 采用一维数组的话,dp[i]代表数组容量为i时能背的最大价值*/int sum = 0;for (int i = 0; i < nums.length; i++) {sum += nums[i];}if (sum % 2 != 0) {return false;}sum /= 2;int[] dp = new int[sum + 1];for (int i = nums[0]; i <= sum; i++) {dp[i] = nums[0];}for (int i = 1; i < nums.length; i++) {for (int j = sum; j >= nums[i]; j--) {dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);}}return dp[sum] == sum;}
  • 1049. 最后一块石头的重量 II
    public int lastStoneWeightII(int[] stones) {/*** - 也是背包问题*/int sum = 0;for (int i = 0; i < stones.length; i++) {sum += stones[i];}int target = sum / 2;int[] dp = new int[target + 1];for (int i = stones[0]; i <= target; i++) {dp[i] = stones[0];}for (int i = 1; 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 - 2 * dp[target];}

总结

提示:这里对文章进行总结:

今天效率一般,心情有点emo,很害怕。

相关文章:

备战秋招012(20230808)

文章目录 前言一、今天学习了什么&#xff1f;二、动态规划1.概念2.题目 总结 前言 提示&#xff1a;这里为每天自己的学习内容心情总结&#xff1b; Learn By Doing&#xff0c;Now or Never&#xff0c;Writing is organized thinking. 提示&#xff1a;以下是本篇文章正文…...

QT中定时器的使用

文章目录 概述步骤 概述 Qt中使用定时器大致有两种&#xff0c;本篇暂时仅描述使用QTimer实现定时器 步骤 // 1.创建定时器对象 QTimer *timer new QTimer(this);// 2.开启一个定时器&#xff0c;5秒触发一次 timer->start(5000); // 3.建立信号槽连接&am…...

【UE4】多人联机教程(重点笔记)

效果 1. 创建房间、搜索房间功能 2. 根据指定IP和端口加入游戏 步骤 1. 新建一个第三人称角色模板工程 2. 创建一个空白关卡&#xff0c;这里命名为“InitMap” 3. 新建一个控件蓝图&#xff0c;这里命名为“UMG_ConnectMenu” 在关卡蓝图中显示该控件蓝图 打开“UMG_Connec…...

【go】GIN参数重复绑定报错EOF问题

文章目录 1 问题描述2 解决&#xff1a;替换为ShouldBindBodyWith 1 问题描述 在 Gin 框架中&#xff0c;当多次调用 ShouldBind() 或 ShouldBindJSON() 方法时&#xff0c;会导致请求体的数据流被读取多次&#xff0c;从而出现 “EOF” 错误。 例如在api层绑定了参数&#x…...

关于MySQL中的binlog

介绍 undo log 和 redo log是由Inno DB存储引擎生成的。 在MySQL服务器架构中&#xff0c;分为三层&#xff1a;连接层、服务层&#xff08;server层&#xff09;、执行层&#xff08;存储引擎层&#xff09; bin log 是 binary log的缩写&#xff0c;即二进制日志。 MySQL…...

我维护电脑的方法

无论是学习还是工作&#xff0c;电脑都是IT人必不可少的重要武器&#xff0c;一台好电脑除了自身配置要经得起考验&#xff0c;后期主人对它的维护也是决定它寿命的重要因素&#xff01; 你日常是怎么维护你的“战友”的呢&#xff0c;维护电脑运行你有什么好的建议吗&#xff…...

AP51656 电流采样降压恒流驱动IC RGB PWM深度调光 LED电源驱动

产品描述 AP51656是一款连续电感电流导通模式的降压恒流源&#xff0c;用于驱动一颗或多颗串联LED 输入电压范围从 5 V 到 60V&#xff0c;输出电流 可达 1.5A 。根据不同的输入电压和 外部器件&#xff0c; 可以驱动高达数十瓦的 LED。 内置功率开关&#xff0c;采用电流采样…...

Python爬虫的解析(学习于b站尚硅谷)

目录 一、xpath  1.xpath插件的安装  2. xpath的基本使用  &#xff08;1&#xff09;xpath的使用方法与基本语法&#xff08;路径查询、谓词查询、内容查询&#xff08;使用text查看标签内容&#xff09;、属性查询、模糊查询、逻辑运算&#xff09;  &#xff08;2&a…...

python的virtualenv虚拟环境无法激活activate

目录 问题描述&#xff1a; 解决办法&#xff1a; 解决结果&#xff1a; 问题描述&#xff1a; PS D:\pythonProject\pythonProject\DisplayToolLibs\venv\Scripts> .\activate .\activate : 无法加载文件 D:\pythonProject\pythonProject\DisplayToolLibs\venv\Scripts\…...

uniapp中token操作:存储、获取、失效处理。

实现代码 存储token:uni.setStorageSync(token, res.data.result);获取token:uni.getStorageSync(token);清除token&#xff1a;uni.setStorageSync(token, ); 应用场景 在登录操作中&#xff0c;保存token pwdLogin() {....this.$axios.request({url: .....,method: post,p…...

乐鑫科技 2022 笔试面试题

岗位:嵌入式软件实习生。 个人情况:本科双非电子信息工程,硕士华五软件工程研一在读;本科做过一些很水的项目 ,也拿项目搞了一些奖,相对来说嵌入式方向比较对口。 时间线及面试流程 2021.04.02 笔试 题目分为选择题和编程题,选择题二十题,编程题两题; 选择题基本…...

实现UDP可靠性传输

文章目录 1、TCP协议介绍1.1、ARQ协议1.2、停等式1.3、回退n帧1.4、选择性重传 1、TCP协议介绍 TCP协议是基于IP协议&#xff0c;面向连接&#xff0c;可靠基于字节流的传输层协议 1、基于IP协议&#xff1a;TCP协议是基于IP协议之上传输的&#xff0c;TCP协议报文中的源端口IP…...

Zebec Protocol 将进军尼泊尔市场,通过 Zebec Card 推动地区金融平等

流支付正在成为一种全新的支付形态&#xff0c;Zebec Protocol 作为流支付的主要推崇者&#xff0c;正在积极的推动该支付方案向更广泛的应用场景拓展。目前&#xff0c;Zebec Protocol 成功的将流支付应用在薪酬支付领域&#xff0c;并通过收购 WageLink 将其纳入旗下&#xf…...

Qt--动态链接库的创建和使用

写在前面 在Qt的实际开发中&#xff0c;免不了使用和创建动态链接库&#xff0c;因此熟悉Qt中动态链接库的创建和使用对后续的库开发或使用是非常用必要的。 在之前的文章https://blog.csdn.net/SNAKEpc12138/article/details/126189926?spm1001.2014.3001.5501中已经对导入…...

设计模式十二:享元模式(Flyweight Pattern)

当我们需要创建大量相似对象时&#xff0c;享元模式可以帮助我们节省内存空间和提高性能。该模式通过共享相同的数据来减少对象的数量。 在享元模式中&#xff0c;有两种类型的对象&#xff1a;享元&#xff08;Flyweight&#xff09;和非享元&#xff08;Unshared Flyweight&a…...

【LeetCode】88. 合并两个有序数组 - 双指针

这里写自定义目录标题 2023-8-7 22:35:41 88. 合并两个有序数组 双指针 2023-8-7 22:35:41 class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int last m n ;while(n > 0){if(m > 0 && nums2[n-1] > nums1[m-1]){nums1[las…...

HarmonyOS应用开发的新机遇与挑战

HarmonyOS 4已经于2023年8月4日在HDC2023大会上正式官宣。对广大HarmonyOS开发者而言&#xff0c;这次一次盛大的大会。截至目前&#xff0c;鸿蒙生态设备已达7亿台&#xff0c;HarmonyOS开发者人数超过220万。鸿蒙生态充满着新机遇&#xff0c;也必将带来新的挑战。 HarmonyO…...

Qt中qmake、构建、运行、清理的区别

Qt 中默认的执行顺序&#xff1a;qmake--- 编译 --- 运行。 一、qmake qmake&#xff1a; 根据之前项目指南创建的项目文件 .pro&#xff0c;并且运行 qmake [qmake xx.pro]生成调试 [build-ttt-***-Debug] 或者发布 [build-ttt-***-Release] 目录&#xff08;这个是影子构建…...

【设计模式——学习笔记】23种设计模式——观察者模式Observer(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入原始方案实现实现问题分析 介绍基础介绍登场角色 案例实现案例一类图实现分析 案例二类图实现 观察者模式在JDK源码的应用总结文章说明 案例引入 有一个天气预报项目&#xff0c;需求如下&#xff1a; 气象站可以将每天测量到的温度、湿度、气压等等以公告的…...

【奇葩瑞萨-004】RX系列单片机的GPIO初始化

RX系列单片机的GPIO初始化 与IO口相关的寄存器端口&#xff08;PORT&#xff09;寄存器端口功能控制&#xff08;MPC&#xff09;寄存器MPC.PmnFPS的设置过程MPC寄存器设置注意事项 端口Pmn的初始化不同端口模式下&#xff0c;PORT、MCP寄存器的配置顺序 感想&#xff1a;与STM…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...