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

系统学习算法:专题十二 记忆化搜索

什么是记忆化搜索,我们先用一道经典例题来引入,斐波那契数

题目一:

相信一开始学编程语言的时候,就一定碰到过这道题,在学循环的时候,我们就用for循环来解决,然后学到了递归,我们又用递归来解决,因此我们大概率第一反应是用递归

代码(递归):

class Solution {public int fib(int n) {//递归结束条件if(n==0||n==1){return n;}//递归公式return fib(n-1)+fib(n-2);}
}

虽然通过了,但是运行时间却很落后了

因此我们要分析时间复杂度

 以n=5时,画出递归展开图

可以发现每次都是以二叉树展开,那么时间复杂度就是O(2^N),是指数级别

指数级别当然不算很好的时间复杂度,可能看n=5时觉得还好,但是一旦超过一定值,那么就会发生指数爆炸,那么消耗时间增长幅度就很恐怖了

因此我们要分析一下能不能优化,很容易发现,其中有很多重复的操作,一开始左分支就求过d(3)了,右分支又要求一遍d(3),求了2次d(3),同理,d(2)也重复求了3次,那么就知道了为什么消耗时间会很高,因为有大部分的时间都在干重复的事情,而这个事情重复干没有意义,完全可以进行优化

那么我们的想法当然是搞一个“备忘录”,这样子我们干完一件事,把结果放进备忘录里,每次干之前都去备忘录里看看,有没有结果能直接用,没有那就说明之前没干过,这是第一次干,那么只能老老实实去干,如果干过了那么直接就抄结果就好了,就好比数学公式,能记住公式结果直接用就好了,不能每次都从头推导吧,太浪费时间了

那么这个备忘录要怎么实现呢,要根据题目的可变参数和返回类型来创建,不同题目实现的备忘录也不同,像我们这道题,可变参数是第n个斐波那契数,n是整型,而这个数的返回值也是整型,所以这个备忘录的映射关系就是<int,int>,那么就可以用数组或哈希表来作为备忘录

这道题数据范围不大,0—30,用数组就足够了

因此我们就用数组作为备忘录,而备忘录一开始要初始化,初始化的时候要记住,必须是返回值之外的数,像斐波那契数一定大于等于0,那么我们就初始化为-1,这样我们遇见-1就知道这是没干过的,如果初始化为0,那么遇见0就有两种可能,返回值就为0或者没干过的,就不确定了

代码(记忆化搜索):

class Solution {int[] memo=new int[31];//初始化public void begin(int[] memo){for(int i=0;i<memo.length;i++){memo[i]=-1;}}public int dfs(int n){//如果之前干过,直接从备忘录拿结果if(memo[n]!=-1){return memo[n];}if(n==0||n==1){return n;}//往备忘录添加memo[n]=dfs(n-1)+dfs(n-2);//返回return memo[n];}public int fib(int n) {begin(memo);return dfs(n);}
}

时间直接来到0ms,分析一下时间复杂度,因为只需要计算一次第0个到第n个斐波那契数列,剩下直接查找拿结果就是了,查找的时间复杂度是常数级,忽略不计,所以时间复杂度为O(N),来到线性级复杂度,已经很优秀了

而还有一种解法,就是动态规划,而动态规划和记忆化搜索很像

完全只是换了一种方式,但思路都是一样的,即将已经计算过的值存起来

代码(动态规划):

class Solution {int[] dp=new int[31];public int fib(int n) {dp[0]=0;dp[1]=1;for(int i=2;i<=n;i++){dp[i]=dp[i-1]+dp[i-2];}return dp[n];}
}

时间复杂度也是O(N)

但这道题的最优解其实是矩阵快速幂,其时间复杂度为O(logN),但主要用这道题来引入记忆化搜索,就不扩展了

到此,对记忆化搜索有了一定理解了,那就是带记忆的去dfs

题目二:

思路:

题意很简单, 就是机器人只能向右和下移动,问有多少条路可以从左上角到达右下角

先用暴搜的方法来写的话,应该没什么难度

我们假设dfs的功能是返回到这个格子有多少种路径,又因为只能向右和向下,所以到达当前格子的路径等于当前位置的左边格子和当前位置的上边格子的路径之和

所以递归公式就找到了:dfs(i,j)= dfs(i-1,j)+ dfs(i,j-1)

而结束条件就是为起点的时候,路径只有一条,而边界情况,越界的不可能有路径,所以返回0

代码(暴搜):

class Solution {public int uniquePaths(int m, int n) {//返回到(m-1,n-1)这个点的路径数return dfs(m-1,n-1);}public int dfs(int i,int j){//起点if(i==0&&j==0){return 1;}//越界if(i==-1||j==-1){return 0;}//递归公式return dfs(i-1,j)+dfs(i,j-1);}
}

结果会超时,分析递归展开图,以(4,4)这个点为例

 可以看到这里就出现了重复的步骤,所以要采用记忆化搜索

还是先搞备忘录,初始化为-1,起点记录1,接下来就是进去先看看是否合法,合法再查找备忘录,有就拿,没有就运算再添加

代码(记忆化搜索):

class Solution {int row,col;//备忘录int[][] memo;public int dfs(int i,int j){//起点if(i==0&&j==0){memo[i][j]=1;return 1;}//越界        if(i==-1||j==-1){return 0;}//查备忘录if(memo[i][j]!=-1){return memo[i][j];}//添加到备忘录memo[i][j]=dfs(i-1,j)+dfs(i,j-1);//返回结果return memo[i][j];}public int uniquePaths(int m, int n) {memo=new int[m][n];//初始化for(int i=0;i<m;i++){for(int j=0;j<n;j++){memo[i][j]=-1;}}return dfs(m-1,n-1);}
}

当然也可以转为动态规划

代码(动态规划):

class Solution {public int uniquePaths(int m, int n) {//多一行和一列就不用考虑越界了int[][] dp = new int[m + 1][n + 1];//起点dp[1][1] = 1;//遍历for (int i = 1; i <= m; i++){for (int j = 1; j <= n; j++) {if (i == 1 && j == 1){continue;}//越界的默认为0dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}            }return dp[m][n];}
}

题目三:

思路:

先理解题意,子序列就两个特点

第一:简单来说就是原数组的子集,即子序列里面的元素个数小于等于原数组的元素个数,并且元素都来自原数组

第二:与原数组的前后顺序是一样的,比如示例1中,2在101前面,那么只要子序列出现2和101,那么2必须在101之前,101必须在2之后

而题目要求的是最长递增子序列,那么先理解递增,比如示例1中,[10,9]是子序列,但是不是递增的,所以不满足条件;在所有递增的子序列中还要求最长的,那么经过列举就知道长度为4,但注意题目虽说[2,3,7,101]是最长递增子序列,但不唯一,因为同理[2,5,7,18]也是,也就是说3和5可以进行互换,101可以和18互换,两两匹对有四个最长递增子序列,但长度都为4

题意理解好了,就来解决问题

要求最长递增子序列,那么我们就枚举出所有递增子序列,再求最长的

先画决策树

 先选子序列的第一位,如决策树的第一层,然后再选子序列的第二位,如决策树的第二层,如此类推(因为要的是递增,所以不是递增的就剪枝掉了)

 所以这时就开始定义dfs的功能,根据题意要求即给dfs一个原数组的位置,要dfs返回以该位置为起点的最长递增子序列

这里其实比较抽象,画递归展开图很绕,所以就像我们之前专题说的,无条件相信dfs,它一定能实现的,宏观的来看递归

然后编写dfs,其中我们拿到起点位置,那么我们要先遍历所有后面的元素,又因为要递增,所以只有大于当前位置的元素才能用,然后用dfs拿到这个后面的元素的最长递增子序列,此时加上当前元素的长度1,与保存结果进行比较,选出最大的并更新

而结束条件这道题其实没有,因为我们在遍历后面元素时,最后会来到最后元素,而最后元素后面没有元素,就不会进入循环,也就不会进入dfs了,这时就直接返回了,而因为最后元素自己也有长度1,所以要返回1,因此结果要初始化为1,而不是0

主函数则遍历数组,看看以哪个位置为起点的递增子序列最长,然后返回最长的长度

代码(暴力):

class Solution {int ret;public int dfs(int[] nums,int cur){//初始化为1,因为最后一个元素时,不进循环,且长度为自身1int ans=1;//遍历后面的元素for(int i=cur+1;i<nums.length;i++){//如果是递增的if(nums[i]>nums[cur]){//选出该元素为起点的最长递增子序列加上当前长度和结果的最大值ans=Math.max(dfs(nums,i)+1,ans);                    }}return ans;}public int lengthOfLIS(int[] nums) {//遍历数组,看看以哪个为起点的递增子序列最长for(int i=0;i<nums.length;i++){ret=Math.max(ret,dfs(nums,i));}//返回最长的return ret;}
}

结果当然是超时了,这个更恐怖,以前还是二叉树为O(2^N),这道直接多叉树,直接是O(N^N)的时间复杂度了

这时就来想想优化

还是刚刚的决策树,多看一下就发现里面有很多重复计算,比如在2这个分支的时候,我们就算过以5为起点的递增子序列的最长长度,而决策树的第一层后面又来了5,又要重新算,所以我们就可以使用记忆化搜索,添加个备忘录

很简单,就进入dfs的时候,看一下备忘录,有就直接用,没有就老实算,算完了就保存到备忘录,再返回

代码(记忆化搜索):

class Solution {int ret;int[] memo;public int dfs(int[] nums,int cur){//如果备忘录里有if(memo[cur]!=0){return memo[cur];}//初始化为1,因为最后一个元素时,不进循环,且长度为自身1int ans=1;//遍历后面的元素for(int i=cur+1;i<nums.length;i++){//如果是递增的if(nums[i]>nums[cur]){//选出该元素为起点的最长递增子序列加上当前长度和结果的最大值ans=Math.max(dfs(nums,i)+1,ans);                    }}//添加到备忘录memo[cur]=ans;return ans;}public int lengthOfLIS(int[] nums) {memo=new int[nums.length];//遍历数组,看看以哪个为起点的递增子序列最长for(int i=0;i<nums.length;i++){ret=Math.max(ret,dfs(nums,i));}//返回最长的return ret;}
}

然后随便改成动态规划,因为我们决策树是先从下往上返回的,所以动态规划填表的顺序是从后往前来填的,因为要知道后面的,才能知道前面的

最后一个元素填表时,对应的是长度是自己,所以为1,那么dp表就全部初始化为1,对应记忆化搜索的代码就是ans=1

代码(动态规划):

class Solution {public int lengthOfLIS(int[] nums) {int ret=0;int[] dp=new int[nums.length];//初始化Arrays.fill(dp,1);//从后往前填for(int i=nums.length-1;i>=0;i--){//往后找子序列for(int j=i+1;j<nums.length;j++){//递增if(nums[i]<nums[j]){dp[i]=Math.max(dp[i],dp[j]+1);}}//更新最长的长度ret=Math.max(ret,dp[i]);}return ret;}
}

题目四:

思路:

 题意需要看懂,如果看不懂题就根本做不了了,题目会给你一个数,让你返回1—n之间猜数字所花费最少的钱且保证绝对能猜对,而其中会出现不花钱的情况,一种是猜对了,另一种是没必要猜因为答案就剩这一个了,其实本质是一样的

其中的决策树的画法我们可以采用暴力枚举,将所有可能的决策全部枚举出来,且枚举的都是最坏情况,即最后一次才能猜出来

第一层就代表第一次选择猜哪一个数,范围从1—n

第二层就代表第二次选择猜哪一个数,假如上一层选择了k,小于则是1(left)—k-1(right),大于则是k+1(left)—n(right)

如此类推枚举

有非常多的决策情况,但会有一种是最优决策,比如1—10,最优决策就是示例1演示的

所以我们暴力枚举出来就行

而有两种结束情况,在小于区间时,k==left+1时,此时k-1==left,就不用继续了,包能猜对的,直接返回花费0元,而在大于区间时,k==right或者right-1时,此时k+1>=right,也不需要花钱,返回0元即可

代码(暴力):

class Solution {public int getMoneyAmount(int n) {//给一个区间,返回所需要的最少钱return dfs(1,n);}public int dfs(int left,int right){//如果只剩下一个或者没有右区间了if(left>=right){return 0;}int ret=Integer.MAX_VALUE;//在left和right区间选猜哪个数需要花ret最少for(int i=left;i<=right;i++){//小于区间int x=dfs(left,i-1);//大于区间int y=dfs(i+1,right);//所有猜的数最少,而每个最少由左右区间最大的决定ret=Math.min(Math.max(x,y)+i,ret);}return ret;}
}

这里主要理解一下max和min这里,max用于决定猜的当前这个数最少需要花多少钱,min用于决定猜哪一个数花费最少

当然会超时,所以用记忆化搜索,因为会有重复的计算,比如下面这个例子

[6,10]这个区间就会重复计算,所以每次计算完一个区间,就记录该区间最少需要花多少钱

每次进去的时候就先去备忘录找一下,有就直接用,没有就算一遍,然后存到备忘录里面

因为有两个参数,所以备忘录也应该是二维的

代码(记忆化搜索):

class Solution {int[][] memo;public int getMoneyAmount(int n) {memo=new int[n+1][n+1];//给一个区间,返回所需要的最少钱return dfs(1,n);}public int dfs(int left,int right){//如果只剩下一个或者没有右区间了if(left>=right){return 0;}//查看备忘录if(memo[left][right]!=0){return memo[left][right];}int ret=Integer.MAX_VALUE;//在left和right区间选猜哪个数需要花ret最少for(int i=left;i<=right;i++){//小于区间int x=dfs(left,i-1);//大于区间int y=dfs(i+1,right);//所有猜的数最少,而每个最少由左右区间最大的决定ret=Math.min(Math.max(x,y)+i,ret);}//存进备忘录memo[left][right]=ret;return ret;}
}

题目五:

 思路:

跟之前走迷宫的题几乎一模一样,暴力枚举每一个点的递增路径,选最长的那个

dfs可以有返回值也可以没有返回值

那我们就暴力的时候用没有返回值的,记忆化搜索就用有返回值的,两个版本都看得到

代码(暴力+无返回值dfs):

class Solution {//方向向量数组int[] dx={0,0,1,-1};int[] dy={1,-1,0,0};int row,col,ret;public int longestIncreasingPath(int[][] matrix) {//行列row=matrix.length;col=matrix[0].length;//暴力遍历每个点的路径情况for(int i=0;i<row;i++){for(int j=0;j<col;j++){dfs(matrix,i,j,1);}}//返回最长的递增路径return ret;}public void dfs(int[][] matrix,int i,int j,int count){//更新最长路径if(count>ret){ret=count;}//上下左右for(int k=0;k<4;k++){int x=i+dx[k],y=j+dy[k];//不越界if(x>=0&&x<row&&y>=0&&y<col){//递增if(matrix[i][j]<matrix[x][y]){//继续遍历下一个点dfs(matrix,x,y,count+1);}}}}
}

最后还是超时了,同理可以记录每一个点的最长路径,这样再次经过这个点的时候,就可以直接用了,而不需要再重复计算一次

还是老规矩,先进去看看备忘录有没有,有就用,没有就算一次,然后存进备忘录里

代码(记忆化搜索):

class Solution {//方向向量数组int[] dx={0,0,1,-1};int[] dy={1,-1,0,0};int row,col,ret;int[][] memo;public int longestIncreasingPath(int[][] matrix) {//行列row=matrix.length;col=matrix[0].length;memo=new int[row][col];//暴力遍历每个点的路径情况for(int i=0;i<row;i++){for(int j=0;j<col;j++){ret=Math.max(dfs(matrix,i,j),ret);}}//返回最长的递增路径return ret;}public int dfs(int[][] matrix,int i,int j){//查看一下备忘录if(memo[i][j]!=0){return memo[i][j];}//算上当前位置路径长度为1int count=1;//上下左右for(int k=0;k<4;k++){int x=i+dx[k],y=j+dy[k];//不越界if(x>=0&&x<row&&y>=0&&y<col){//递增if(matrix[i][j]<matrix[x][y]){//找到最长路径的方向count=Math.max(dfs(matrix,x,y)+1,count);}}}//记录到备忘录memo[i][j]=count;//返回该点的最长路径return count;}
}

总结:

其实难的不是记忆化搜索,而是如何写出暴搜的代码,也就是dfs,如果暴搜能过就过,过不了就看看能不能用记忆化搜索来优化,不是所有的暴搜都能转记忆化搜索的,要看是否存在相同的计算,如果有,那么就添加一个备忘录,dfs进去的时候就看一看备忘录,有就用,没有就算一次,然后再保存到备忘录,几乎是个模板,难的还是dfs

综上所有递归回溯的部分就基本学完了,接下来会继续学其他的算法

相关文章:

系统学习算法:专题十二 记忆化搜索

什么是记忆化搜索&#xff0c;我们先用一道经典例题来引入&#xff0c;斐波那契数 题目一&#xff1a; 相信一开始学编程语言的时候&#xff0c;就一定碰到过这道题&#xff0c;在学循环的时候&#xff0c;我们就用for循环来解决&#xff0c;然后学到了递归&#xff0c;我们又…...

Redis基操

redis 存储在内存中 key-value存储 主要存储热点数据(短时间大量的访客去访问) 启动命令 redis-server.exe redis.windows.conf 客户端链接redis服务器 redis-cli.exe redis-cli.exe -h localhost -p 6379 redis-cli.exe -h localhost -p 6379 -a 123456 退出 exit keys * 命…...

基于 GEE 计算并下载研究区年均叶面积指数 LAI 和光合有效辐射分量 FPAR

目录 1 完整代码 2 运行结果 1 完整代码 var table table; var collection ee.ImageCollection(MODIS/061/MOD15A2H).filterDate(2023-01-01, 2023-12-30).filterBounds(table); // LAI配色 var colorLai {min: 0,max: 100,palette: [ffffff, fde0d4, fcc4ac, faa784, f…...

软考——WWW与HTTP

1.万维网&#xff08;world wide web&#xff09; 是一个规模巨大的、可以资源互联的资料空间。由URL进行定位&#xff0c;通过HTTP协议传送给使用者&#xff0c;又由HTML来进行文件的展现。 它的主要组成部分是&#xff1a;URL、HTTP、HTML。 &#xff08;1&#xff09;URL…...

sqli-labs-master第46关

目录 报错注入 直接注入 数据库名 数据库中的表名 users表结构&#xff1a; users表数据&#xff1a; python脚本注入 直接注入 获取数据库名 获取表名 获取表结构 获取数据 布尔盲注 获取数据库名 获取表名 获取表结构 获取数据 报错注入 直接注入 数据库名…...

opencv交叉编译报错:undefined reference to `png_riffle_palette_neon

序偶NEON 概述 NEON&#xff08;Nested Enhanced Vector Instruction Set&#xff09;是 ARM 架构中的一种高级 SIMD&#xff08;Single Instruction, Multiple Data&#xff0c;单指令多数据&#xff09;扩展技术。它专为加速多媒体和信号处理任务而设计&#xff0c;允许在单…...

代码随想录算法训练day63---图论系列7《prim算法kruskal算法》

代码随想录算法训练 —day63 文章目录 代码随想录算法训练前言一、53. 寻宝—prim算法打印出来最小生成树的每条边 二、53. 寻宝—kruskal算法打印出来最小生成树的每条边 总结 前言 今天是算法营的第63天&#xff0c;希望自己能够坚持下来&#xff01; 今天继续图论part&…...

算法日常刷题笔记(2)

为保持刷题的习惯 计划一天刷3-5题 然后一周总计汇总一下 这是第二篇笔记 笔记时间为2月17日到2月23日 第一天 找到初始输入字符串 找到初始输入字符串 Ihttps://leetcode.cn/problems/find-the-original-typed-string-i/ Alice 正在她的电脑上输入一个字符串。但是她打字技…...

C# httpclient 和 Flurl.Http 的测试

关于C#调用接口或Post,Flurl封装了httpclient, CSDN有哥们提供了一个公网的测试网站&#xff0c;可以测试Post调用&#xff0c;我写了2个函数&#xff0c;测试httpclient和Flurl使用Post: async 和 await 是成对使用的&#xff0c;为了接受web异步返回的数据&#xff0c;winfor…...

关于ES中text类型时间字段范围查询的结构化解决方案

前言 有关es中text类型的时间字段范围查询的问题&#xff0c;比如&#xff1a; {"query": {"range": {"insertTime": {"gte": "2025-02-01T00:00:00","lte": "2025-11-30T23:59:59","format&quo…...

四元数 欧拉角

orientation 是表示物体在三维空间中的 旋转姿态 的数据结构。它通常使用 四元数&#xff08;Quaternion&#xff09; 来表示旋转。四元数是一种数学工具&#xff0c;用于描述三维空间中的旋转&#xff0c;相比欧拉角&#xff08;Euler Angles&#xff09;和旋转矩阵&#xff0…...

Linux项目自动化构建工具-make/Makefile (linux第六课)

目录 背景 介绍 依赖关系的格式 依赖方法的格式 原理 背景 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的规则来指定…...

Java 登录框架

Java框架中常用的几种成熟的token生成框架对比 - 白露~ - 博客园 SpringBoot整合sa-token&#xff0c;jwt登录及拦截器鉴权Demo_只有在集成 sa-token-jwt 插件后才可以使用 extra 扩展参数-CSDN博客 推荐一款轻量级权限认证框架Sa-Token&#xff0c;集成JWT和Redis轻松实现认…...

人工智能、机器学习、深度学习和大语言模型之间的关系

人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;、深度学习&#xff08;DL&#xff09;和大语言模型&#xff08;LLM&#xff09;之间是逐层包含且技术递进的关系&#xff0c;具体如下&#xff1a; 1. 层级关系 人工智能&#xff08;AI&#xff09;…...

项目组合管理:优化项目选择与资源分配——从战略到实战的全流程指南

在复杂的商业环境中&#xff0c;企业往往需要同时推进多个项目以支撑战略目标。然而&#xff0c;资源有限、目标冲突、优先级模糊等问题常导致项目失败或资源浪费。项目组合管理&#xff08;Project Portfolio Management, PPM&#xff09; 正是解决这一痛点的系统性方法。它通…...

zabbix排障-zabbix监控的主机出现可用性灰色或者红色问题

目录 解决zabbix-agent可用性灰色的办法: 解决zabbix可用性红色的方法: 在zabbix日常的使用中 我们会遇到很多的问题 就比如今天我做好zabbix-server和zabbix-agent两台机器的配置 然后在wen页面上发现两台主机都有可用性的问题 如下图 解决zabbix-agent可用性灰色的办法: …...

C语言(13)------------>do-while循环

1.do-while循环的语法 我们知道C语言有三大结构&#xff0c;顺序、选择、循环。我们可以使用while循环、for循环、do-while循环实现循环结构。之前的博客中提及到了前两者的技术实现。可以参考&#xff1a; C语言&#xff08;11&#xff09;-------------&#xff1e;while循…...

2025-spring boot 之多数据源管理

1、是使用Spring提供的AbstractRoutingDataSource抽象类 注入多个数据源。 创建 DataSourceConfig 配置类 通过spring jdbc 提供的带路由的抽象数据源 AbstractRoutingDataSource import org.springframework.beans.factory.annotation.Autowired; import org.springframew…...

自动驾驶两个传感器之间的坐标系转换

有两种方式可以实现两个坐标系的转换。 车身坐标系下一个点p_car&#xff0c;需要转换到相机坐标系下&#xff0c;旋转矩阵R_car2Cam&#xff0c;平移矩阵T_car2Cam。点p_car在相机坐标系下记p_cam. 方法1&#xff1a;先旋转再平移 p_cam T_car2Cam * p_car T_car2Cam 需要注…...

DeepSeek 细节之 MoE

DeepSeek 细节之 MoE DeepSeek 团队通过引入 MoE&#xff08;Mixture of Experts&#xff0c;混合专家&#xff09; 机制&#xff0c;以“分而治之”的思想&#xff0c;在模型容量与推理成本之间找到了精妙的平衡点&#xff0c;其中的技术实现和细节值得剖思 Transformer 演变…...

SeaCMS V9海洋影视管理系统报错注入

漏洞背景 SQL 注入攻击是当前网络安全中最常见的一种攻击方式&#xff0c;攻击者可以利用该漏洞访问或操作数据库&#xff0c;造成数据泄露或破坏。通常发生在开发人员未能正确处理用户输入时。 在 SeaCMS V9 中&#xff0c;用户输入&#xff08;如登录、评论、分页、ID 等&a…...

Cannot deserialize instance of java.lang.String out of START_ARRAY token

这个错误 Cannot deserialize instance of java.lang.String out of START_ARRAY token 表示 Jackson 正在尝试将一个 JSON 数组反序列化成一个 String 类型的字段&#xff0c;但是 JSON 中传递的是一个数组而不是单一的字符串。 具体来说&#xff0c;这段堆栈信息&#xff1a…...

LeetCode 解题思路 1(Hot 100)

解题思路&#xff1a; 使用哈希表优化查找&#xff1a;利用哈希表存储已遍历元素的值及其索引&#xff0c;将查找时间从O(n)降至O(1)。一次遍历&#xff1a;遍历数组&#xff0c;对每个元素计算其补数&#xff08;target - nums[i]&#xff09;&#xff0c;若补数存在于哈希表…...

js中的await与async的使用

以下两个方法&#xff0c;区别只在有没有catch&#xff0c;使用的时候却要注意 // 封装请求方法&#xff0c;同步loading状态出去 export const fetchWithLoading async (fn: Function, params: any, loading: Ref) > {loading.value true;try {return await fn(params);…...

蓝耘科技上线 DeepSeek 满血版,500万tokens免费送

&#x1f31f; 嗨&#xff0c;我是Lethehong&#xff01;&#x1f31f; &#x1f30d; 立志在坚不欲说&#xff0c;成功在久不在速&#x1f30d; &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞⬆️留言收藏&#x1f680; &#x1f340;欢迎使用&#xff1a;小智初学…...

【入门音视频】音视频基础知识

&#x1f308;前言&#x1f308; 这个系列在我学习过程中&#xff0c;对音视频知识归纳总结的笔记。因为音视频相关讲解非常稀少&#xff0c;所以我希望通过这个音视频系列&#xff0c;跟大家一起学习音视频&#xff0c;希望减少初学者在学习上的压力。同时希望也欢迎指出文章的…...

w~视觉~合集13

我自己的原文哦~ https://blog.51cto.com/whaosoft/13384038 #xxx w视觉合集13~17没了.... #ViTAR 作者提出了一种新颖的架构&#xff1a;任意分辨率的视觉 Transformer &#xff08;ViTAR&#xff09;。ViTAR中的自适应标记合并功能使模型能够自适应地处理可变分辨率图像…...

DeepSeek+Kimi 一键生成100种PPT

一 简介 PPT在工作中经常用到&#xff0c;无论是给老板汇报&#xff0c;还是同事、朋友之间的分享&#xff0c;或是去见投资人:) &#xff0c;都离不开它&#xff0c;然而写PPT经常让人感觉不胜其烦&#xff0c;无论是逻辑的展开、还是页面的布局、字体、配图&#xff0c;都像个…...

【Qt之QQuickWidget】QML嵌入QWidget中

由于我项目开始使用Widgets,换公司后直接使用QML开发&#xff0c;没有了解过如何实现widget到qml过渡&#xff0c;恰逢面试时遇到一家公司希望从widget迁移到qml开发&#xff0c;询问相关实现&#xff0c;一时语塞&#xff0c;很尴尬&#xff0c;粗略研究并总结下。 对qwidget嵌…...

Apache Flink CDC (Change Data Capture) mysql Kafka

比如使用 Flink CDC , 监听mysql bin-log日志实现数据的实时同步, 发送到kafka springboot整合flink cdc监听数据库数据 阿里开源的神仙工具&#xff0c;完美实现数据同步&#xff01;#程序员阿里开源的这个神器很好很强大。阿里开源的这个神器全面超越Canal&#xff0c;果然在…...

Week1_250217~250223_OI日志(待完善)

W1_250217~250223_OI日志 250217大致安排题目 250218大致安排题目 250219大致安排 250217 大致安排 上午讲了树上启发式合并&#xff0c;中午和下午补了上午的题&#xff0c;额外做了一道。 题目 U41492 树上数颜色 &#xff08;老师自己出的&#xff0c;实在是太典中点了&…...

线性模型 - 学习总结

本文对前面博文中所学的机器学习的知识进行总结&#xff0c;以便整体上加深对机器学习的理解。 一、机器学习三要素&#xff1a;模型、学习准则、优化算法 机器学习是从有限的观测数据中学习(或“猜测”)出具有一般性的规律&#xff0c;并 可以将总结出来的规律推广应用到未观…...

IP----访问服务器流程

1.访问服务器流程 1.分层 1.更利于标准化 2.降低层次之间的关联性---每一层都只完成自身层次所执行的功能--每一层都在下层的基础上提供增值服务 1.应用层 抽象语言---编码---提供人机交互的接口 2.表示层 编码--二进制&#xff0c;压缩解压缩、格式转换 3.会话层 建立…...

Visual Studio 中 C/C++ 函数不安全警告(C4996)终极解决方案:分场景实战指南

问题描述 在 Visual Studio 中编写 C/C 代码时&#xff0c;使用 scanf、strcpy、fopen 等传统函数会触发以下警告&#xff1a; C4996: xxx: This function or variable may be unsafe. Consider using xxx_s instead. 根本原因&#xff1a; 这些函数缺乏缓冲区溢出检查&#…...

DeepSeek写俄罗斯方块手机小游戏

DeepSeek写俄罗斯方块手机小游戏 提问 根据提的要求&#xff0c;让DeepSeek整理的需求&#xff0c;进行提问&#xff0c;内容如下&#xff1a; 请生成一个包含以下功能的可运行移动端俄罗斯方块H5文件&#xff1a; 核心功能要求 原生JavaScript实现&#xff0c;适配手机屏幕 …...

小程序高度问题背景scss

不同的机型&#xff0c;他的比例啥的都会不一样&#xff0c;同样的rpx也会有不同的效果。所以这里选择了取消高度。 <view class"box-border" :style"{padding-top: ${navHeight}px,}"><!-- 已登录 --><view v-if"userStore.userInfo&…...

浅析 DeepSeek 开源的 FlashMLA 项目

浅析 DeepSeek 开源的 FlashMLA 项目 DeepSeek 开源周 Day 1&#xff08;2025 年 2 月 24 日&#xff09;放出的开源项目——FlashMLA&#xff0c;是一款针对 Hopper 架构 GPU 高效多层级注意力 (Multi-Level Attention, MLA) 解码内核&#xff0c;专门为处理变长序列问题而设…...

【Blender】二、建模篇--08,小狐狸角色建模

这堂课呢 我们来完成本套课程建模片的最后一个模型 小狐狸 这堂课呢 主要想让大家一起走一遍角色建模的一个基本流程 让你以后遇到类似的模型时候有一个基本的建模思路 那我们现在就开始吧 2 00:00:16,830 --> 00:00:24,390 我们还是在我们之前建模马拉松的那个文件里面继…...

【Gin-Web】Bluebell社区项目梳理6:限流策略-漏桶与令牌桶

本文目录 一、限流二、漏桶三、令牌桶算法四、Gin框架中实现令牌桶限流 一、限流 限流又称为流量控制&#xff0c;也就是流控&#xff0c;通常是指限制到达系统的并发请求数。 限流虽然会影响部分用户的使用体验&#xff0c;但是能一定程度上保证系统的稳定性&#xff0c;不至…...

MySQL 数据库基础

1. MySQL 数据库基础 在这一部分&#xff0c;我们将学习 MySQL 的基本概念和常见的数据库操作&#xff0c;帮助你掌握如何创建数据库、表&#xff0c;并进行数据的增、删、改操作。同时&#xff0c;我们还会探讨一些常见的错误示例及其原因&#xff0c;帮助你避免常见的陷阱。…...

如何查看java的字节码文件?javap?能用IDEA吗?

编译指令&#xff1a; javac YourProject.java 查看字节码文件的指令&#xff1a; javap -c -l YourProject.class 不添加-c指令就不会显示字节码文件&#xff1a; 不添加 -l 就不会显示源代码和字节码文件的对应关系&#xff1a; 添加-l之后多出来这些&#xff1a; IDEA不太…...

实战技巧:如何快速提高网站收录的权威性?

快速提高网站收录的权威性是一个系统性的工作&#xff0c;涉及内容质量、网站结构、外部链接、用户体验等多个方面。以下是一些实战技巧&#xff0c;可以帮助你快速提升网站收录的权威性&#xff1a; 一、提升内容质量 原创性&#xff1a; 确保网站内容具备高质量与原创性&a…...

详解传输层协议TCP/UDP

传输层 传输层是OSI模型的第四层&#xff0c;主要负责端到端的数据传输&#xff0c;确保数据可靠、有> 序地从源设备传送到目标设备。其主要功能包括&#xff1a; 端到端通信&#xff1a;在源和目标设备之间建立连接&#xff0c;确保数据准确传输。数据分段与重组&#xff1…...

案例|某开关站室外轮式巡检机器人解决方案

随着电网规模的扩大和复杂性的增加&#xff0c;传统的GIS开关设备巡视工作面临着巨大的挑战。人工巡视不仅劳动强度大、效率低&#xff0c;而且难以保证巡视的准确性和全面性。此外&#xff0c;GIS设备通常位于复杂的环境中&#xff0c;如高海拔、高湿度、强电磁干扰等&#xf…...

穿越虚拟与现实:解密Linux进程的地址空间

在 Linux 操作系统中&#xff0c;每个进程都有独立的虚拟地址空间。虚拟地址空间是操作系统为每个进程提供的抽象内存模型&#xff0c;它使得每个进程都觉得自己拥有独立的内存&#xff0c;而不需要关心物理内存的具体布局。本文将深入探讨 Linux 进程的虚拟地址空间及其管理机…...

什么是MySql的主从复制(主从同步)?

主页还有其他面试题总结&#xff0c;有需要的可以去看一下&#xff0c;喜欢的就留个三连再走吧~ 1.什么是MySql的主从复制原理&#xff1f; 主从复制的核心就是二进制binlog&#xff08;DDL&#xff08;数据定义语言&#xff09;语句和DML&#xff08;数据操纵语言&#xff09…...

C++面向对象编程技术研究

一、引言 面向对象编程&#xff08;OOP&#xff09;是一种程序设计方法&#xff0c;它将现实世界中的实体抽象为“对象”&#xff0c;并通过类和对象来实现程序的设计。OOP的核心思想包括封装、继承和多态&#xff0c;这些特性使得程序更加模块化、易于扩展和维护。C作为一种支…...

MySQL 连表查询:原理、语法与优化

目录 引言 什么是连表查询&#xff1f; 连表查询的类型 1. 内连接&#xff08;INNER JOIN&#xff09; 2. 左连接&#xff08;LEFT JOIN&#xff09; 3. 右连接&#xff08;RIGHT JOIN&#xff09; 4. 全连接&#xff08;FULL JOIN&#xff09; 5. 交叉连接&#xff08;…...

力扣2382. 删除操作后的最大子段和

力扣2382. 删除操作后的最大子段和 题目 题目解析及思路 题目要求找到每次删除一个元素的最大字段和 因为删除不好做&#xff0c;可以转删除为添加&#xff0c;用并查集维护当前子段和 两部分合并(两个并查集)&#xff0c;三部分求和(两个并查集和一个元素) 代码 class S…...

PMP--题库--一模--纯问题

文章目录 单选题 &#xff08;每题1分&#xff0c;共170道题&#xff09;1、 [单选] 根据项目的特点&#xff0c;项目经理建议选择一种敏捷方法&#xff0c;该方法限制团队成员在任何给定时间执行的任务数。此方法还允许团队提高工作过程中问题和瓶颈的可见性。项目经理建议采用…...