自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(72)
  • 收藏
  • 关注

原创 使用JNI机制加载本地方法的小案例

最近在学习Android,其中需要使用到c的库,这个时候就要使用到JNI机制了,简单来说,就是可以通过这个机制,让java代码可以调用本地c语言编写的代码,将c语言编写的代码打包成动态库,然后,在java代码中使用native关键字修饰方法,再将so文件加载进JVM即可,那么废话不多说,下面来看看这个demo吧。

2024-04-30 14:18:11 166

原创 工欲善其事必先利其器(在windows使用clion编程,远程连接linux服务器)

需要在windows上安装,在linux上安装。

2024-04-22 00:43:12 339

原创 动态规划专练( 231.打家劫舍Ⅱ)

在这三种情况中,其实情况一的值一定是小于等于情况二和情况三的。因为情况二和三考虑的范围包括住了情况一,在一个更大的范围内求解最大值,一定是大于等于的关系。的基础上进行了变化,将首尾两个元素连成了环,成环之后思考的难度提高了很多,因为如过要使用动态规划的话,不知道从哪个位置开始。你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,首尾成环相较于没有成环,其实是多了三种情况。,今晚能够偷窃到的最高金额。

2024-04-16 21:08:42 394

原创 动态规划专练( 198.打家劫舍)

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,给定一个代表每个房屋存放金额的非负整数数组,计算你。本题的话是一道一维动态规划的题,首先设计dp数组。,一夜之内能够偷窃到的最高金额。

2024-04-16 20:54:13 169

原创 动态规划专练( 279.完全平方数)

个数,物品的重量相当于平方,物品的价值相当于1,背包容量相当于本题的n。是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。本题也是一个完全背包的运用场景。n只能由完全平方数构成,也就是只能由。的完全平方数的最少数量。,这个范围的数的平方。那么物品就相当于是这。

2024-04-15 23:37:56 220

原创 动态规划专练( 322.零钱兑换)

本题也是一道完全背包的应用题。可以把coins理解成物品的容量,由于需要求使用最少的硬币来组合,因此可以将每个coin的价值理解成是1,然后使用完全背包的思想来做,就是,使用coins中的物品,装满背包容量为amount的情况下,最小价值是多少。如果没有任何一种硬币组合能组成总金额,返回。,表示不同面额的硬币;你可以认为每种硬币的数量是无限的。计算并返回可以凑成总金额所需的。

2024-04-15 23:02:13 207

原创 动态规划专练( 337.组合总和Ⅳ)

然后组合数和序列数这两种情况,虽然有点难以理解,但是记忆了对应的代码写法,无非是两个for循环的位置换一下。思来想去没想明白,然后再使用518题的代码来运行了一下,打印出了二维数组,发现在使用二维数组的情况下,两个for循环的位置是不重要的,他们求的都是组合数(裂开)。有很相似的地方,都是完全背包的应用场景,区别在于,518题是求解的组合数,而本题求解的是序列数。由于前面练习的背包题,因此这个题写的很流畅,运行测试用例的时候还是很自信的,结果没过。因此后来改了滚动数组的写法,得到了正确的结果,代码如下。

2024-04-15 21:59:29 545

原创 动态规划专练( 518.零钱兑换Ⅱ)

这里和01背包的滚动数组写法稍有区分,第二层的for循环是需要正序遍历的,虽然这滚动数组对我来说任然难以理解,但是可以从二维数组的角度来推理,01背包的递推是加上。递推表达式为,当我可以放入当下物品的时候,我存在两种选择,可以拿取任意这个零钱,也可以不拿取这个零钱。本题求解的是组合数,当分析到这个地步的时候基本上只要写出完全背包统计组合数的模板就可以了。,从这里可以看出,完全背包它本身就是要加上已经修改过的值,因此从前往后覆盖是正确的。本题是属于完全背包的问题,问当容量不超过amount时候的最大组合数。

2024-04-15 21:45:54 338

原创 动态规划专练( 1049.最后一块石头的重量Ⅱ)

看解释,我们只要把这个数组分成最接近元素和一半的两堆,然后再减一下就可以得到碰撞后的最小值了是不是啊。那不就是要求,数组中的某个集合最接近某个值的问题吗。可以转成01背包的思想,和。,然后将它们一起粉碎。假设石头的重量分别为。这个题居然是个01背包,这是我万万想不到的。如果没有石头剩下,就返回。有一堆石头,用整数数组。

2024-04-12 01:17:35 184

原创 动态规划专练( 416.分割等和子集)

这个时候可以怎么转换呢,使用01背包的思想,这个数组中每个值都只能使用一次,每个元素的重量就是这个值,每个元素的价值也就是这个值,背包的容量就是数组元素和的一半。就这题来说,要求我们将数组分割成两个元素和相等的子集,其实就是在问,数组中是否存在一个集合,他的元素和等于数组值的一半。说说我对01背包的理解,如果我能把一道题的要求转换为,求数组中的某个集合的值最趋近于某个值,那就可以使用01背包来解。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

2024-04-12 01:16:36 185

原创 动态规划专练( 343.整数拆分)

这个数的最大拆分的值,拆成多个数的组合也都在里面了。所以可以得出状态转移方程为。,嗯这个好理解,那如何拆成三个数,四个数,n个数呢。中的最大值,遍历i次找到最大值即可。),并使这些整数的乘积最大化。首先这个题是存在子问题的,定义。数组,还是一样,我们先拆出一个。进行拆分,首先拆成两个数。这个时候可以利用之前的。你可以获得的最大乘积。

2024-04-11 20:46:07 267

原创 动态规划专练(63.不同路径Ⅱ)

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。初始化的时候也需要注意一下,如果第一行出现了障碍物,那么这个障碍物后面所有的格子都是不可达的都是0。的基础上进行思考,多了一个障碍物的设定,不难设想,在障碍物存在的地方都是不可达的,如果。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格的左上角 (起始点在下图中标记为 “Start” )。网格中的障碍物和空位置分别用。列是一个障碍物,那么。

2024-04-11 00:59:18 184

原创 动态规划专练(62.不同路径)

考虑到第i行第j列的时候,如何才能走到第i行第j列,只能从第i - 1行第j列这个位置向下走,或者从第i行第j-1列这个位置向右一步。那么可以得出走到第i行第j列的走法是,走上上面格子和左边格子的可能性相加。由于题目表示只能向右和向下,那么从左上角出发,第一行所有的走法都是只有唯一的一种,第一列也是一样,都初始化成1.机器人试图达到网格的右下角(在下图中标记为 “Finish” )。网格的左上角 (起始点在下图中标记为 “Start” )。的含义为到第i行,第j列所有的走法。问总共有多少条不同的路径?

2024-04-11 00:42:21 361

原创 leetcode刷题(剑指offer) 47.全排列Ⅱ

的基础上使用Set数据结构进行去重。给定一个可包含重复数字的序列。返回所有不重复的全排列。

2024-02-29 23:05:07 350

原创 leetcode刷题(剑指offer) 46.全排列

*解法:**经典的深搜+回溯提醒,设计递归的时候主要考虑以下几个参数,t(指代当前路径的深度), path(存储路径节点的list)如上图所示,t代表路径的深度,也就是二叉树对应的层数,path用来收集可走的二叉树的节点。给定一个不含重复数字的数组。

2024-02-29 22:53:34 360

原创 上线服务时遇到的一个SSLHandshakeException错误

发生原因如下:在java8及高版本以上的环境调用ssl的时候会出现SSLHandshakeException这个错误。今天部署自己的一个程序,在本地是可以正常跑通流程了,但是部署到服务器上运行之后出现了如下错误。将其中的SSLv3, TLSv1, TLSv1.1都注释掉。需要修改jdk中的一个叫java.security的文件。然后重启java程序即可。

2024-02-28 09:41:27 575

原创 leetcode刷题(剑指offer) 297.二叉树的序列化和反序列化

这道题涉及到了二叉树的序列化与反序列化,由于序列化和反序列化的操作必须是可逆的,因此必须将完整的二叉树序列化(就是将叶子节点下面的节点也都序列化出来,序列化成两个null),这样反序列化之后的树才能是唯一的。序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。左边的数字表示这个节点的值在序列化之后的数组中的index,右边的数字表示这个节点的值。

2024-02-03 21:34:47 457 1

原创 leetcode刷题(剑指offer)138.随机链表的复制

本题难点在于random指针的不确定性,如果只是单纯的复制整个链表可以依次拷贝各个节点,然后修改指向,但是随着random指针的加入,我们无法确定,让random指向哪,因此想到使用hash表先将所有的节点映射起来。在复制链表的时候,我们可以获取到原始链表的random指向的节点,然后将这个节点作为key,从hash表中取出对应的值。指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。节点组成,其中每个新节点的值都设为其对应的原节点的值。返回复制链表的头节点。

2024-02-03 18:13:30 360

原创 leetcode刷题(剑指offer)113.路径总和Ⅱ

重复子问题:每次都在targetSum的基础上减去root.val,并递归执行左子树和右子树。在遍历的过程中记录出路径,当检测到当前抵达根节点时,判断路径和是否等于。递归的结束条件为:如果当前的root为空,直接结束。路径总和等于给定目标和的路径。是指没有子节点的节点。

2024-02-03 16:10:31 371

原创 leetcode刷题(剑指offer) 103.二叉树的锯齿形层序遍历

但是这种方法是不是太笨了呢,明明可以直接存好,还特意进行了依次翻转逻辑,所以参考了大佬的代码。类似,我则是在遍历的基础上加了方向的标志位,依靠判断方向的标志位,对数组进行翻转。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

2024-02-02 21:20:56 682

原创 leetcode刷题(剑指offer) 102.二叉树的层序遍历

先将root节点放入队列中,每次都弹出队头节点,取出节点,然后将取出节点的left节点和right节点依次放入到队列中,直到没有节点再能放入到队列中为止(即:队列为空)。本题是要层级遍历二叉树,将每层的所有节点都存入到list中。表示为下一层的最后一个节点,这个变量每次从队列中取出节点都会进行更新,当弹出节点等于。接替围绕着这两个点,首先可以使用队列来层级遍历每个节点,思路类似于。时,即可将一层的list存入总的list,且将。(即逐层地,从左到右访问所有节点)。表示为当前层的最后一个节点,

2024-02-02 20:38:09 477

原创 leetcode刷题(剑指offer) 946.验证栈序列

这题的思路是借用一个辅助栈来模拟push和pop操作,每次都将pushed中的元素放入到栈中,然后判断能否出栈,循环的弹出栈中元素,当所有入栈,出栈操作都完成之时,再判断栈是否为空,如果是空,那就说明push和pop满足栈的顺序,否则就是不满足。:每次入栈之后,循环判断,栈顶元素和popped的popIndex位置上的元素是否相等,相等即可出栈。,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回。两个序列,每个序列中的。:按照数组顺序,依次入栈。

2024-02-02 15:33:58 344

原创 leetcode刷题(剑指offer) 155.最小栈

左边黄色部分是栈中的val,右边绿色部分是当前栈中的最小值,最小值只需要在每次入栈的时候顺带更新一下,其时间复杂度也为o(1)。因此可以考虑到在保存栈中val值的时候,顺带保存当前栈中的最小值,如下图所示。获取最小值的方法的时间复杂度在O(1)级别,那就是说明,计算最小值的过程应该在。getMin出栈的时候,只需要弹出栈顶的最小值即可。操作,并能在常数时间内检索到最小元素的栈。

2024-02-02 13:57:56 376

原创 leetcode刷题(剑指offer)54.螺旋矩阵

本题使用了vis数组记录了走过的路径,设定初始移动方向为向右,如果不能再向右了那就切换方向为向下移动,判定条件为(当前格子已经走过了,或者数组越界了)。按照上述逻辑依次切换四个方向,当走完整个matrix的时候,vis会全部记录为true,此时,上下左右都无法移动,可以直接将结果返回。,返回矩阵中的所有元素。

2024-02-01 17:01:22 327

原创 leetcode刷题(剑指offer) 101.对称二叉树

有相似的思维,同为判断数的部分是否相等,区别则是,本题是判断左子树和右子树是否相等,而。**进阶:**你可以运用递归和迭代两种方法解决这个问题吗?是判断不同的两棵树是否相等,本题多了一个镜像翻转的逻辑。给你一个二叉树的根节点。, 检查它是否轴对称。

2024-02-01 16:27:21 391

原创 leetcode刷题(剑指offer) 226.翻转二叉树

递归函数中进行翻转,将翻转结果,返回给root的右子树,右子树也同理。注意需要一个中间变量将左子树先保存一下。看到二叉树第一反应就是递归了,将root的左子树送入。,翻转这棵二叉树,并返回其根节点。给你一棵二叉树的根节点。

2024-02-01 15:59:00 316

原创 leetcode刷题(剑指offer) 572.另一棵树的子树

的基础上,判断一棵树是否为另一颗树的一部分,需要将root和subRoot先放入isSametree中进行比较,然后再将root的左子树和右子树分别递归调用。可以先将题目进行简化,变成如何判断两棵树相等。从根节点开始,如果根节点相等,那就递归的比较左子树和右子树。具有相同结构和节点值的子树。的某个节点和这个节点的所有后代节点。也可以看做它自身的一棵子树。

2024-02-01 15:39:24 355

原创 leetcode刷题(剑指offer) 21.合并两个有序链表

解法类似于归并排序中合并两个数组的部分,由于头节点不确定,因此需要创建一个。指向list2,比较p1和p2的值,较小的先放入到dummy所在链表中。新链表是通过拼接给定的两个链表的所有节点组成的。将两个升序链表合并为一个新的。

2024-02-01 14:35:02 339

原创 leetcode刷题(剑指offer)206.反转链表

*进阶:**链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?,请你反转链表,并返回反转后的链表。分表表示两个节点的前后关系,需要让。的下一个保存起来,方便下次扫描。本题的思路是扫描一遍链表,使用。

2024-02-01 13:49:02 345

原创 leetcode刷题(剑指offer)142.环形链表Ⅱ

本题为判断一个链表中是否存在环,如果不存在就返回null,如果存在就返回入环的第一个节点,解题套路相对固定,类似于。指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。如果链表中有某个节点,可以通过连续跟踪。,返回链表开始入环的第一个节点。来表示链表尾连接到链表中的位置(,仅仅是为了标识链表的实际情况。**进阶:**你是否可以使用。给定一个链表的头节点。如果链表无环,则返回。,则在该链表中没有环。

2024-02-01 11:12:38 338

原创 leetcode刷题(剑指offer) 19.删除链表的倒数第N个节点

但本题存在一个注意点,就是如果只有一个节点,只是删除第一个,那么就需要删除头节点,这就涉及到了头节点的改变,因此还是用到了之前。本题的解题思路是使用两个指针,在此我定义三个指针分别为。**进阶:**你能尝试使用一趟扫描实现吗?举个栗子,链表为[1], n等于1。指针指向的元素就是链表中的倒数第n个,给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。节点用来指向头节点,最后返回。先向前移动n格,然后再让。中提到的技巧,创建一个。遍历到最后一个的时候,

2024-02-01 01:39:36 343

原创 leetcode刷题(剑指offer)905.按奇偶排序数组

left指针遇到奇数,就和right指针位置上的元素交换位置,并且让right向左移动一格(因为不确定和交换之后left位置上是否还是为奇数,因此不能动left,但是right位置上一定是奇数了,所以可以将right想左移动),left遇到偶数,那就left向右移动一格。中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。解法类似于快速排序中,处理数组主元,左右整体有序的过程。定义两个指针,一个从前往后。

2024-02-01 01:07:08 394

原创 leetcode刷题(剑指offer) 10.正则表达式匹配

当p和s都为空的时候一定是可以匹配上的;当p为空,且s不为空的时候,他们一定是无法匹配的;当s为空,且p不为空的时候,只有。正则表达式的引擎则是由有限状态机实现的,由于博主还没搞懂怎么使用。本题是实现一个简易的正则表达式匹配,对于本题而言,有两种方案。遇到了*****: 这也是这题最难的一点*可以匹配任意多个。dp赋值的橙色部分,则按照上述的三种字符串的逻辑来填充。在动态规划中,我们已知的可以使用来求解。黄色和红色部分均为初始化,橙色部分为后续需要填写的。,请你来实现一个支持。的,而不是部分字符串。

2024-01-31 14:59:34 814

原创 leetcode刷题(剑指offer) 82.删除排序链表中的重复元素Ⅱ

首先,我们需要明确三个点,递归函数的作用是什么,递归函数的出口是什么,我们能解决什么小问题,然后将后续的逻辑交给递归函数。写递归逻辑的时候,在函数中调用递归函数本身的时候,将他当成已经实现的函数来使用。迭代法同理,这里需要了解的一个小技巧是,因为在这道题中head是会发生变化的,因此可以创建一个。的下一个即可,这样即使后续的head被删了,我们最后返回的头节点的写法还是不会变化的。链表中,把重复的节点都删除,由于是有序的,因此重复的节点都是。节点,让它的下一个指向head节点,最后返回。

2024-01-30 11:21:44 365 1

原创 leetcode刷题(剑指offer) 237.删除链表中的节点

是当前需要删除的2节点,由于题目中给出提示,每个节点的值都是唯一的,所以可以直接将3节点的值赋值给2,然后再跳过三号节点指向四号节点。这样就实现了逻辑上的删除。本题难点在于,无法走正常的删除节点的流程,因为无法获得上一个节点的信息,只能获取当前节点及其后续的链节点。注意,删除节点并不是指从内存中删除它。,我们想删除它其中的一个节点。照上面的这个例子,题目中给出的。不是链表中的最后一个节点。给你一个需要删除的节点。,并且保证给定的节点。

2024-01-30 00:03:05 396

原创 leetcode刷题(剑指offer) 50.Pow(x, n)

底数为3,指数分别对应二进制每个位的权重,将二进制位为1的数位都相乘。即可得出最后的幂运算结果。这种思想是利用二进制不同位的不同权重的思想来解决的。在计算结果的时候顺带计算出当前位的权重。快速幂运算,会出现的两种情况,求奇次幂,求偶次幂。迭代求解,这里就忽略了,直接进入快速幂运算。计算x的n次幂,主要有以下几种方法。,如果要求x的100次方,可以使用。,按此逻辑一直递归下去即可。

2024-01-29 22:31:44 981

原创 leetcode刷题(剑指offer) 191.位1的个数

可以看出将任意数与1相与,只能得出0和1两个结果,且这个结果是由输入数n的最后一位决定的,根据此结果,可以得到n的最后一位是0还是1。编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为。将输入数n依次向右移动0到32位,与上1,可以求得n各个位上是否为1。在这个逻辑上将n向右移动1位,2位。32位,就可以遍历得到输入数n的1的个数。输入数据长度为32位的。

2024-01-29 20:49:30 317

原创 leetcode刷题(剑指offer) 79.单词搜索

board, 当前匹配的board中字符的横坐标, 当前匹配的board中字符的纵坐标,word, 当前word匹配的字符的wordIndex。本题是经典的深搜+剪枝题,思路:从一个点,往上下左右四个方向进行搜索,如果能走,就递归走下去,当走完整个word的时候,表明数组中存在这个单词。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。:当wordIndex(当前word匹配的字符所对应的索引)等于。的下一个,即可返回匹配失败。

2024-01-29 16:29:55 583

原创 leetcode刷题(剑指offer) 153.寻找旋转排序数组中的最小值

上述的两种情况已经包含了所有可能性,上面的题解是将mid和最右边的值进行比较的,当然也可以和最左边的值进行比较,也可以一半一半的减少搜索范围,且也可以包含所有可能性。定义左边界和右边界,取中间值,如果中间值比右边界更大,那说明,中间值及中间值左边的内容都是被旋转过的,这一半数据可以直接丢弃。如果中间值比有边界更小,那说明,中间值处于没有被旋转的那部分,中间值右边(不包括中间值)的这部分不可能存在最小值,因此可以直接丢弃。,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。次旋转 后,得到输入数组。

2024-01-29 15:16:42 619

原创 leetcode刷题(剑指offer) 509.斐波那契数

这个题是简单的计算斐波那契数列,斐波那契数列就是, 1, 1, 2, 3, 5, 8。本文介绍这题的三种不同时间复杂度的解法,分别是递归实现O(n^2),迭代实现O(n),矩阵乘法实现O(logn)。但是乘法的话存在快速幂运算的计算方法,使用快速幂运算,可以将运算的时间复杂度进一步降低。算法时间复杂度是O(n),和递归实现的区别是,总是记录了前两个值,相当于记忆性递归的效果。只需要记录第n-1项,第n-2项,第n项,就可以使用乘法的方法来计算出第n+1项。计算a的n次方,如果a是偶数,那就直接计算。

2024-01-29 00:37:14 1021

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除