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

基于二分查找的动态规划 leetcode 300.最长递增子序列

如题:

https://leetcode.cn/problems/longest-increasing-subsequence/description/

其实常规动态规划的解法就没什么好说的了,有意思的是官方放出了一个二分查找的动态规化解法,时间复杂度能降到O(nlog(n)),但是为什么这样能解,似乎讲的不是那么清楚。

另外,即使是从操作步骤及状态转移函数上来说,可能俄罗斯套娃的第二个解里面还说的更清楚一点~~。具体可以去看题解:

. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=O83Ahttps://leetcode.cn/problems/russian-doll-envelopes/solutions/633231/e-luo-si-tao-wa-xin-feng-wen-ti-by-leetc-wj68/注:因为俄罗斯套娃信封问题,最终转换成了最长递增子序列问题,所以在求最长递增子序列的时候的解法是一模一样的,下面的截图就是354.俄罗斯套娃信封问题的官方解二。

这里面最关键的就是“f[j]表示h的前i个元素可以组成的长度为j的最长严格递增子序列的末尾元素的最小值”这一点,只要f[j]满足这一条件(状态转移的公式也完全是按照这个概念来的),并且把所有有定义的f[j]都计算完,那么最大的j就是最长严格递增子序列的长度(j从0开始,则长度就是最大的j加1啦)。

一。初步实操

不过这个概念似乎本身就有点绕啊,结合一下实际操作更容易理解,并且操作过程我稍微加点东西(参考的是laboladong的算法笔记里面的patience game纸牌游戏,不过他也没有说这么解为什么一定行)

数组就用题目里的,即nums=[0,3,1,6,2,2,7],f函数也可以当成一个列表,长度会一点点增长,元素值也可能会更新,一开始f是空的。

第1步,直接把nums第0个元素加到f中,即f[0]=0

此时的f[0]的含义就是当前长度为1的严格递增子序列的末尾元素的最小值就是0

第2步,取nums第1个元素,值为3,它明显比f[0]=0大,所以把它放到f[1]

此时的f[1]的含义就是当前长度为2的严格递增子序列的末尾元素的最小值就是3

其实f[j]的含义永远不会变啦,只是值可能会变,后不缀述。

第3步,取nums[2]=1,它比f[0]=0大,比f[1]=3小,所以更新f[1]的值为1。

我为什么把1写在3的下面,没有把3擦掉?后面自有妙用,并且这就是patience game纸牌游戏的玩法。

注意,我们更新的位置就是大于等于1的最小值。即f=[0, 3],找1的位置,自然就是3了。

此处直接多列举些情况:

a)f=[0, 3, 4],找1,找到的位置索引为1(从0开始),即f[1]=3

b)f=[0, 3, 4],找4,找到的位置索引为2,即f[2]=4

c)f=[0, 3, 4, 4]?,找4,找到的位置索引为2,即f[2]=4(最左边的4哦),但是,但是注意了!f其实不可能出现这种情况,正因为我们会在f=[0, 3, 4]找4的时候返回位置2,所以我们不会再新增一个4,只会用4更新4(你也可以认为啥也没变),所以更新完了仍然是f=[0, 3, 4]。我只是在此阐述一下严格的查找逻辑。

d)官方题解里面说先找到小于它的最大值f[j0],然后去更新f[j0+1],其实是一样的,正如c)中所说,f中不会有重复值。

第4步:

第5步:

第6步:

第7步:

好,结束了,f最终为[0, 1, 2, 7],所以最长严格递增子序列的长度就是4。(我说“所以”,只是按照题解的说明说的,并不是在敷衍啊。。。,我的解释还在后面)

另外,你确实也找不到更长的严格递增子序列啦,比如0 3 6 7,0 1 2 7都是4。

你可能会问,f最终为[0, 1, 2, 7],是不是代表[0, 1, 2, 7]就是最长严格递增子序列?那还真不一定

我立马就给你举个反例,比如nums=[0,3,1,6,7,2,2],最终画出来还是一样的图

得到的自然是一样的f=[0, 1, 2, 7],但是明显[0, 1, 2, 7]不是最长严格递增子序列,当然喽此时最长严格递增子序列长度仍然是4,只是这次的答案只有:[0, 3, 6, 7]

你可能会问,那是不是上图的第一行就一定是最长严格递增子序列?那仍然还真不一定

我再给你举一个反例,比如nums=[6,0,3,1,2,2,7],第1行的6 3 2 7明显不是,不过提前透露一下,判断它是不是的办法十分简单,那就是如果它不是,它就不是【狗头】。

别急,我说“如果它不是”的意思就是,直接判断它是不是一个严格递增序列,只要它是,那它就是最长严格递增子序列。那如果它真不是,那我仍然想知道谁是,咋办呢,办法也很简单,就是从右往左,从上往下,挨个找,找到的第一个比右侧小的值,就在严格递增序列之中

最后一列那选7肯定没错,第3列2也OK,第1列3不行,往下找,1行(不是1 hang, 是1 xing哦),就它了,第0列6不行,0行,就它了,所以0 1 2 7必然是最长严格递增子序列,并且最终你会发现,这么找的算法复杂度还很低,它就是O(n),原因很简单,上图中的所有元素就是原nums中的元素,一共就n个,顶多把每个遍历一遍。至于为什么这样找就能找出来,下面再详述。

二。进一步分析

先言归正传,为什么最长严格递增子序列的长度,就是f的最终长度呢?

继续研究一下刚才的实操过程,再贴一下,nums=[0,3,1,6,2,2,7]

比如第4步,

此时我们已经处理完的元素为0 3 1 6,这里面的最长严格递增子序列只有0 1 6或者0 3 6,注意上图6放的位置,6一定在第2列(从第0列开始算),3一定在第1列,0一定在第0列,其实还有一个1,它也一定在第1列。虽然这里只有nums的前4个元素,但只要把局部想明白了,后面所有的元素都是按照这个规则来堆的。

之前说到,怎样才能从上图的这堆数字中找出最长严格递增子序列,而不是只知道其长度呢?

为什么不能简单地根据从左往右的顺序来取?原因很简单,比如上图的1,他虽然处于第1列,6处于第2列,但这并不代表在nums中它一定在6的左边,我立马给你找个反例:

nums=[0, 3, 6, 1],堆出来的f图跟上图一模一样,可是在nums中1明显在6的右边。所以问题就是,f图中不能直接看出所有数字在nums中的先后顺序

如果你能知道摆放这些数字的先后顺序,那你就确切地找出所有可能的最长严格递增子序列。

即,比如我记住了,先放0,其次放3,再次放1,最后放6,那自然0 3 6, 0 1 6都是ok的,当然实际上代码中不会记住这件事。但是有一件事我们是能确定的,那就是在放6之前,第0列,第1列都有人了!否则6也跑不到第2列来,其实串起来说就是,第1列中有一个元素x,它一定在6之前就放进来了,并且它比6小,第0列中有一个元素y,它一定在x之前就放进来了,并且它比x小。

你可能有几点疑惑:

a)为啥一定会有y<x<6?

正如上面所说,虽然我记不住f图的堆放顺序,但是它一定有这么个过程啊,所以y和x是客观存在的,只是你不能一眼看出它们是谁。

你要是没明白,我再废话几句,回忆一下摆放过程,6为什么放在第2列,因为它比第1列的某个元素x大(同时如果6这一列在6之上还有元素z的话,那6自然还满足,它小于等于z),这里的x就是1(虽然3也比6小,但实际6是跟1比较的),1为什么在第1列,因为它比第0列的某个元素y大,这里的y就是0。

b)你为啥说有一个元素y,有一个元素x,跟6在同一行的0和3不就是的吗?

正如你所问,第0行的元素,摆放顺序必然是0在3之前,3在6之前。但是,第0行的元素它未必是一个递增序列,比如[6, 0, 1, 3],其f图如下,很明显,6 1 3它不行,0 1 3它才行

等等,我问的是同一行,你说第0行?em....这个坑请见文章第四大点

c)你为啥要强调有这么一个顺序,并且y<x<6?

因为y,x,6它就是当前的最长的严格递增子序列啊!

别跟上图搞混啊,我把对应图再放一下

d)嗯,我能明白y x 6一定是一个严格递增子序列了,但我想不明白它为什么一定是最长的?

如果不能证明这一点,那我这帖子仍然是在敷衍。所以到了最关键的步骤了。

另外,我们再确认一下,你怀疑最长严格递增子序列长度>=3,起码3的下限我们是确定了!

现在让我们抛开杂念【狗头】,不要管y,x具体是什么,但是6它是具体的,因为它就是我们当前正在摆放的元素,如下图,现在的实际情况就是,我们按照摆放规则,6就是摆在了第2列(从0列开始),但是你怀疑存在某个以当前这个6结尾的严格递增子序列,它的长度大于3,也就是说存在一个z,它能插到6的前面。我们逐个分析有没有这种可能性。

(1)这个序列是y x z 6

z明显在x之后再往图上摆放,如果当时x这一列下面没东西,末端就是x,那么会因为z大于x,所以z放到第2列末端。如果x这一列下面还有东西,末端是xmin,那还是一样啊,z更是大于xmin了。

那问题是如果z放到了第2列,那再轮到放6的时候,它怎么可能仍然放在第2列?它只可能放到3列了

(2)同样的道理,y z x 6,z y x 6都是不行的,与上图矛盾。

(3)这个序列是y x 6 z

开玩笑,我们现在处理的当前元素是6,后面的还没处理到,一个个来。我们现在要确定的是因为当前元素摆在第2列(从0列开始),所以以当前元素结尾的最长严格递增子序列的长度就是3。

所以说,其实我们每往图上摆一个元素,它摆在哪一列,就说明了以这个元素结尾的最长严格递增子序列的长度,就是对应的列数(从0列开始算的话,自然要加1啦)

等我们把所有元素都摆完了,那么最大的列数,自然就是真正的最长严格递增子序列的长度了。

(4)这个序列是y x z1 z2,它是4,比y x 6长呢,并且z1,z2在nums中排在6之前

完全有可能,比如nums=[0,3,1,7,8,6],f图如下,6仍然在第3列,但是在摆放6的时候,当前最长严格递增子序列的长度就已经是4了,而不是3.

但是注意,我们并没有说错,正如第3点中所说,是以6结尾的最长严格递增子序列长度为3.

我为什么之前说的时候没有加上“以6结尾”这个前缀,我先把之前的图放一下

因为当时的这个图,一共就3列,并且当时还没有到强调这个前缀的时候。所以重点就是第3点中的那段红字,可以再回顾一下,它就是证明的关键了!

三。上代码

注,由于原题只需要计算长度,不需要找出序列,所以代码中其实跟题解的逻辑是一样的,即只更新f值,而不是把所有数字摆成牌堆。上述的牌堆只是为了理解原理。

from typing import Listimport bisectclass Solution:def lengthOfLIS(self, nums: List[int]) -> int:piles = [nums[0]]for i in range(1, len(nums)):if piles[-1] < nums[i]:piles.append(nums[i])find_index = Solution.bisect_left(piles, nums[i])# find_index = bisect.bisect_left(piles, nums[i])piles[find_index] = nums[i]return len(piles)@staticmethoddef bisect_left(a, x, l=0, h=-1):if h == -1:h = len(a)while l < h:mid = (l + h) // 2if x > a[mid]:l = mid + 1else:  # elif x <= a[mid]# 这里为什么不是h = mid - 1,因为如果找不到x,则找大于x的最小值,即右边界我们可能是需要的# 为什么把x == a[mid]的分支也合到这里面?其实只是想跟bisect.bisect_left逻辑保持一致而已,即如果存在重复的x,则返回最左边的x# 实际上本题不可能有重复的x,完全可以在找到x后立马返回,能稍微快那么一点点h = midreturn lif __name__ == '__main__':nums = [0, 3, 1, 6, 2, 2, 7]print(Solution().lengthOfLIS(nums))

四。那序列到底怎么找出来?

前面提过找的方法,再总结一下

从右往左找,第3列(从0列开始),就选第0行的7

第2列,第0行2小于7,OK,就它了

第1列,第0行3大于2,不行,第1行1小于2,OK,就它了

第0列,第0行6大于1,不行,第1行0小于1,OK,就它了(对,你可能发现了,虽然第1列取的1已经是第1行了,但是第0列仍然从第0行开始找

为什么这么找一定行呢?

我们换个例子,nums=[3,8,7,4,5,1]

很明显,3 4 5就是最长严格递增子序列,这是我们直接看nums得出的。但是在f图上,怎么才能确定4是在5之前的呢?正如我们之前所说,你既然想从f图中获取信息,那就请想象,5之前一定有一个x比5小,这是第一个已知条件。条件二是:8绝对在5之前,这是无疑的,因为它们在第0行

可惜现在8比5大,假设紧接着8下面的那个元素z比5小,请问z是不是一定在5之前,答案是一定!

有图好分析,现在把z标出来,假设z比5小,但是z在nums中就是排在5之后,有没有可能?没可能!假设z真的排在5之后,那z下面的4也肯定排在5之后,那问题来了,5到底是因为谁而来到了第2列(从0列开始),兄弟你排错队了啊!所以如果z比5小,它绝对排在5之前。
当然喽,我们看z的时候发现它其实是7,它虽然排在5之前,但它不顶用啊,同理的逻辑继续往下找,找到的第1个小于5的元素,绝对排在5之前。

问题1:

你刚才说如果z比5小,则它一定在5之前。但你好像没说,如果z大于等于5的话,它也一定在5之前啊?

它当然还是在5之前啦,因为它下面绝对有一个比5小的new_z,就是那个4啦,4在5之前,那z还不在5之前?

问题2:

现在发现4在第2行了(从第0行开始),那处理第0列的时候,还是从第0行开始吗?

自然得从第0行开始,其实我刚留了一个坑没说明白,我说8一定在5之前,是因为它们都在第0行,注意,不是因为它们是同一行,而是第0行。0乃创世之初,从左到右遵循先创与后创,其它行则不然。所以我们只有确定第0行不行的时候,才能往下找。

具体到第0列就是,我们只有发现3大于等于4的时候,才能去找1。当然喽,3实际小于4,所以我们没证据表明1是行的。我们只有证据表明,3是行的。

相关文章:

基于二分查找的动态规划 leetcode 300.最长递增子序列

如题&#xff1a; https://leetcode.cn/problems/longest-increasing-subsequence/description/ 其实常规动态规划的解法就没什么好说的了&#xff0c;有意思的是官方放出了一个二分查找的动态规化解法&#xff0c;时间复杂度能降到O(nlog(n))&#xff0c;但是为什么这样能解&…...

Java8 IntStream流sum的Bug

做. - 力扣&#xff08;LeetCode&#xff09;的时候发现 IntStream流中的sum在相加的过程中会加到突破Int上限导致数据不对&#xff0c;需要装成LongStream流才能有正确的输出。 long sum Arrays.stream(milestones).asLongStream().sum(); 要这样子写&#xff0c;只把sum改…...

PCL 索引空间采样

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 索引空间采样 2.1.2 可视化原始点云和下采样后的点云 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xf…...

PasteForm最佳CRUD实践,实际案例PasteTemplate详解之3000问(三)

作为“贴代码”力推的一个CRUD实践项目PasteTemplate,在对现有的3个项目进行实战后效果非常舒服&#xff01;下面就针对PasteForm为啥我愿称为最佳CRUD做一些回答: 哪里可以下载这个PasteForm的项目案例 目前“贴代码”对外使用PasteForm的项目有"贴Builder(PasteSpide…...

【无标题】logistic映射

当Logistic映射中的控制参数 μ \mu μ 为负数时&#xff0c;系统的行为与正数 μ \mu μ 的情况截然不同。Logistic映射的一般形式是&#xff1a; x ( t 1 ) μ x ( t ) ( 1 − x ( t ) ) x(t1) \mu x(t) (1 - x(t)) x(t1)μx(t)(1−x(t))其中 x ( t ) x(t) x(t) 表示时…...

基于Node.js+Express+MySQL+VUE科研成果网站发布查看科研信息科研成果论文下载免费安装部署

目录 1.技术选型‌ ‌2.功能设计‌ ‌3.系统架构‌ ‌4.开发流程‌ 5.开发背景 6.开发目标 7.技术可行性 8.功能可行性 8.1功能图 8.2 界面设计 8.3 部分代码 构建一个基于Spring Boot、Java Web、J2EE、MySQL数据库以及Vue前后端分离的科研成果网站&#xff0c;可…...

提升C++代码质量的一些建议

文章目录 1. 命名清晰2. 简洁性3. 一致性4. 注释5. 避免复杂性6. 重构7. 测试8. 错误处理9. 文档10. 代码复用11. 性能优化12. 安全性- 代码规范推荐 C开发中&#xff0c;写出优雅且可维护的代码不仅能提升代码质量&#xff0c;还能提高团队协作效率和项目长期的可扩展性。以下…...

起重机防摇摆技术如何达标-武汉正向科技

武汉正向科技防摇摆控制器 主要技术参数 1、防摇摆精度&#xff1a; 0.4 2、行车到达目标位置偏差位置偏差&#xff1a; 25mm 3、通讯方式&#xff1a;PROFINET / PROFIBUS / RS232 / RS422 / RS485&#xff1b; 4、消除载荷的摇摆达 96% 以上&#xff1b; 5、技术先进…...

[大语言模型-论文精读] MoRAG - 基于多部分融合的检索增强型人体动作生成

MoRAG--Multi-Fusion Retrieval Augmented Generation for Human Motion KS Shashank, S Maheshwari, RK Sarvadevabhatla - arXiv preprint arXiv:2409.12140, 2024 MoRAG - 基于多部分融合的检索增强型人体动作生成 1. 目录 MoRAG--Multi-Fusion Retrieval Augmented Generat…...

解决端口被占用

当你被你的编译器提醒&#xff0c; 当前端口被占用&#xff0c; 但明明你的服务什么的都没有启用&#xff0c;这时有三种解决办法&#xff1a; 1 。 重启 。 重启解决80%的问题 2 。 修改你的端口号 。 3 。 去windows命令行中查看&#xff0c;端口占用情况 第一步 &#xf…...

【递归】7. leetcode 404 左叶子之和

1 题目描述 题目链接&#xff1a;左叶子之和 2 解答思路 递归分为三步&#xff0c;接下来就按照这三步来思考问题 第一步&#xff1a;挖掘出相同的子问题 &#xff08;关系到具体函数头的设计&#xff09; 第二步&#xff1a;只关心具体子问题做了什么 &#xff08;关系…...

react+antdMobie实现消息通知页面样式

一、实现效果 二、代码 import React, { useEffect, useState } from react; import style from ./style/index.less; import { CapsuleTabs, Ellipsis, Empty, SearchBar, Tag } from antd-mobile; //消息通知页面 export default function Notification(props) {const [opti…...

Git 撤销一个已经push到远端仓库的commit

在 Git 中&#xff0c;撤销一个已经推送到远程仓库的改动有几种不同的方法&#xff0c;具体取决于你是否想要完全删除改动&#xff0c;还是只是恢复文件的某个状态。以下是常见的几种方法&#xff1a; git revert 撤销特定的commit git revert 是最安全的方法&#xff0c;因为…...

lambda表达式底层实现

一、lambda 代码 & 反编译 原始Java代码 假设我们有以下简单的Java程序&#xff0c;它使用Lambda表达式来遍历并打印一个字符串列表&#xff1a; import java.util.Arrays; import java.util.List;public class LambdaExample {public static void main(String[] args) {…...

鸿蒙NEXT开发-组件事件监听和状态管理(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...

《More Effective C++》的学习

引用与指针 没有所谓的null reference reference一定需要代表某个对象&#xff0c;所以C要求reference必须有初值。 QString &s; 使用reference可能比使用pointer更高效。 因为reference一定是有效的&#xff0c;而指针可能为空&#xff08;需要多加一个判断&#xff0…...

Leetcode面试经典150题-322.零钱兑换

给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无限的。 示…...

python17_len()函数

len()函数 A B "" C "hello world" D 18 E 18def len_test(s):try:# 尝试计算字符串的长度length len(s)return lengthexcept TypeError:# 如果不是字符串&#xff0c;则返回 None 或者提示错误return Noneif __name__ "__main__":# 单…...

车视界系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;汽车品牌管理&#xff0c;汽车颜色管理&#xff0c;用户管理&#xff0c;汽车信息管理&#xff0c;汽车订单管理系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;汽车信息&#xff0c;我…...

SQLCMD命令行工具导入数据并生成对应的日志文件

SQLCMD是一个命令行工具,专门用于在Microsoft SQL Server数据库上运行SQL脚本和管理任务。它提供了一种交互式和自动化的方式来执行SQL命令和脚本,并允许用户与SQL Server数据库进行高效的交互。以下是关于SQLCMD的详细介绍: 主要功能 执行SQL脚本: SQLCMD可以执行包含SQL…...

tauri中加载本地文件图片或者下载网络文件图片后存储到本地,然后通过前端页面展示

有一个需求是需要将本地上传的文件或者网络下载的文件存储到本地&#xff0c;并展示在前端页面上的。其实如果只是加载本地文件&#xff0c;然后展示还是挺简单的&#xff0c;可以看我的文章&#xff1a;tauri程序加载本地图片或者文件在前端页面展示-CSDN博客 要想实现上述需…...

QSqlDatabase在多线程中的使用

Qt中多线程使用数据库_qt数据库管理类支持多数据库,多线程-CSDN博客 1. 代码&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError>…...

【无人机设计与控制】Multi-UAV|多无人机多场景路径规划算法MATLAB

摘要 本研究探讨了多无人机路径规划问题&#xff0c;提出了三种不同算法的对比分析&#xff0c;包括粒子群优化&#xff08;PSO&#xff09;、灰狼优化&#xff08;GWO&#xff09;和鲸鱼优化算法&#xff08;WOA&#xff09;。利用MATLAB实现了多场景仿真实验&#xff0c;验证…...

Visual Studio C# 编写加密火星坐标转换

Visual Studio C# 编写加密火星坐标转换 1、WGS84坐标转GCJ02火星坐标2、GCJ02火星坐标转WGS84坐标&#xff08;回归计算&#xff09;3、GCJ02火星坐标转BD09百度坐标4、BD09百度坐标转GCJ02火星坐标&#xff08;回归计算&#xff09;5、坐标公共转换类6、地图显示7、程序简单界…...

微服务-流量染色

1. 功能目的 通过设置请求头的方式将http请求优先打到指定的服务上&#xff0c;为微服务开发调试工作提供便利 请求报文难模拟&#xff1a;可以直接在测试环境页面上操作&#xff0c;流量直接打到本地IDEA进行debug请求链路较长&#xff1a;本地开发无需启动所有服务&#xf…...

C语言实现 操作系统 经典的进程同步问题(2)

哲学家进餐问题 哲学家进餐问题是一个经典的同步问题&#xff0c;涉及多个哲学家试图同时用餐&#xff0c;但每个哲学家左右两边只有一把叉子。为了避免死锁和饥饿&#xff0c;可以使用记录型信号量&#xff08;也称为计数信号量&#xff09;来管理叉子的使用。 1、利用记录型…...

有效的字母异位词【字符串哈希】

题目 题解&#xff1a; 1.排序&#xff1a; #include<algorithm>class Solution{public:bool isAnagram(string s,string t){sort(s.begin(),s.end());sort(t.begin(),t.end());return st;} } 时间复杂度O(nlogn) 2.哈希表 #include<algorithm>int hash1[100]; …...

如何选择与运用工具提升工作效率的秘密指南

一、引言 ----  在当今这个信息爆炸的时代&#xff0c;编程工具的选择对于开发者的工作效率至关重要。从智能的代码编辑器到强大的版本控制工具&#xff0c;再到那些能让我们事半功倍的自动化脚本&#xff0c;每一款工具都有其独特的优势和价值。那么&#xff0c;哪款编程工具…...

Spring系列 AOP实现过程

文章目录 实现原理EnableAspectJAutoProxyAnnotationAwareAspectJAutoProxyCreator 代理创建过程wrapIfNecessarygetAdvicesAndAdvisorsForBeanfindCandidateAdvisorsfindAdvisorsThatCanApply createProxy AspectJ注解处理代理调用过程 实现原理 本文源码基于spring-aop-5.3.…...

C语言 getchar 函数完全解析:掌握字符输入的关键

前言 在C语言中&#xff0c;getchar 是一个非常实用的函数&#xff0c;用于从标准输入流&#xff08;通常是键盘&#xff09;读取单个字符。这对于处理文本输入非常有用&#xff0c;尤其是在需要逐个字符处理的情况下。本文将深入探讨 getchar 函数的用法和特点&#xff0c;并…...

58同城保定网站建设/企业站seo价格

问题 Image和Label数据成对写入TFRecord文件&#xff0c;按理训练过程中读取的Image和Label也应该是一一对应的&#xff0c;但有的时候发现Image和Label并不能匹配。如&#xff1a; 将以下数据写入TFrecord中&#xff1a; Image 1 —— Label 1 Image 2 —— Label 2 Image …...

做网站用的hu软件/惠州seo计费

一、作用域 1、作用域问题&#xff1a;在一个函数中定义的变量&#xff0c;在其他函数中能否被引用&#xff1f;在不同位置定义的变量&#xff0c;在什么范围内有效&#xff1f; 2、定义变量可能有3种情况 [谭浩强] &#xff08;1&#xff09;在函数的开头定义&#xff1b; &am…...

建网站能赚钱吗赚多少/如何进行网站制作

更多精彩文章请关注微信号&#xff1a;...

做母婴的网站有哪些/怎么制作网站教程步骤

六个例子彻底理解finally语句块 这篇博客主要弄清楚两个问题 1. finally块中的代码是否一定会执行 2. finally块中的代码什么时候被执行 首先开始第一个: finally块中的代码一定会被执行么? 答案是否定的,主要有以下几种情况: 1.try之前发生异常或者直接结束的情况. final…...

专业做破碎机的网站/日本免费服务器ip地址

配置tokenstore.js&#xff0c;state中的数据一刷新就会消失&#xff0c;所以需要在localStorage中重新获取state: {//从localStorage中获取&#xff0c;没有则为空字符串token:localStorage.getItem(token)||},mutations: {//设置state.token对象setUtoken(state,token){state…...

胶州为企业做网站的公司/重庆森林台词

2019独角兽企业重金招聘Python工程师标准>>> src:http://nanhaochen.blog.51cto.com/228629/47081 又碰到servlet 输出中文乱码的问题&#xff0c;恼火。研究了一下&#xff0c;有了新的发现和认识。 原始代码&#xff1a; java 代码 protected void doGet(HttpServ…...