自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 解决idea连接数据库时,test connection无法正常下载missing driver files错误(保姆级,超详细!)

如图,我们现在要通过idea连接mysql数据库,在连接界面我们输入user和password后,发现要download missing driver files。(如果电脑中已经有mysql-connector-java可跳过这几步下载教程,忘记下载到哪了可以跟着重新下一遍,很快就下好了)可以看到class报红解除,接下来删除第一个报红的Mysql Connector/J,选中它,点击右侧的-号。再次进入mysql连接的那一栏,输入root和你的密码,点击test connection,发现成功连接。

2024-03-22 12:47:29 970 4

原创 Java算法之位运算入门

有了这个基础我们再来看上面的公式,a-1的效果是把a从右往左数的第一个1变成0,举个栗子:a的二进制是00011100,那么a-1就要借位,结果是00011011,可以看到,第一个1变成了0,1之前的0变成了1。其他位要么是a&a,要么是a&1s,结果都为a本身,所以a&(a-1)的结果中,除了a的从右往左数第一个1变为0之外,其他位都不变。即,要把二进制数的第i位变成1,我们应该|一个数,这个数的第i位是1,其余位是0(这样就能x | 0 = x,从而使其余位不变)。注意这里的二进制表示都是补码。

2023-12-22 21:36:08 46

原创 利用快速排序解决区间第k大

快速排序在最坏的情况下会有n2的复杂度,十分麻烦,如果给你的是这种测试样例的话,就会超时。先用一轮快速排序确定基准元素的最终位置,如果发现基准元素是第k+1大,K+2大...那就说明第k大的元素比基准元素大,在基准元素右侧,则用递归的方式到右侧寻找;如果发现基准元素是第k-1大,k-2大....那就说明第k大的元素比基准元素小,在基准元素左侧,用递归的方式到左侧寻找;我们知道,快排一轮后,基准元素就已经排好,位于排序的最终位置.数组中基准元素左边的元素都比它小,右边的元素都比他大。个最大的元素,而不是第。

2023-12-18 13:51:33 44 1

原创 两种实现方式,带你清晰牢固地掌握Java快速排序(小白可入)

Java快速排序,两种实现方式,详细,小白可入。

2023-11-22 12:48:25 185 4

原创 二叉树最小深度问题:Leetcode111

显然不能,如果对节点1使用Math.min,它的左子树null又返回了结果0,那这就不对了,因为一条最短路径的终点并不是null,也不是节点1,而应该是叶子结点。所以如果出现了有一边子树为Null而另一边不为Null的情况,就要重新写递推式子,这时最小深度应该是:如果左子树为空,最小深度为右子树最小深度+1;还有没有别的方法呢?是有的,你想,最小深度对应路径是根节点和叶子结点路径中,最短的一条。//如果根节点不为Null,左右子树也不是只有一边为null,就是正常情况,返回左右子树最小深度中的最小值加1。

2023-10-16 14:05:06 49 1

原创 递归方式轻松搞定二叉树合并算法

再把两个根节点的右子树合并,连在新节点的right指针上。显然合并左子树也是这个流程,根节点相加,左右子树合并再连接......这样一直递归,到什么时候结束呢?以上图为例,Tree1的3节点右侧为null,所以合并对应位置的树时,就可以直接将Tree2对应位置的树直接移植过来,也就是说,当根节点为null时,合并就直接完成了——合并结果是对应位置的另一棵树。如果一棵树已经为null的话,那么可以说,合并的结果就是另一棵树,方法完成,并将这棵树作为结果返回连接在父节点的指针域上。//一样是递归的思路。

2023-09-17 20:26:36 89 1

原创 Java —— 一文理解递归与二叉树遍历

访问9的左子树:为null,stack.pop()出栈,拿到节点9,然后再拿到9的右子树,仍然为null。这个序列是后序遍历的倒序。访问左子树的时候又会进入左子树的前序遍历,(相当于又进入了一个方法),先访问左子树的根节点,再访问这个左子树的左子树......所以我们可以发现,最后直到node也为null,栈也为null时(即访问到节点7的右子树发现为null时,此时栈也为null),这时就结束了大循环,完成了二叉树的迭代前序遍历。后面,也不行,那就是右子树还没有遍历完就先加入了根节点,是错误的。

2023-09-15 11:48:04 245

原创 二叉树层序遍历,万变不离其宗

然后,遍历这一层的元素,将其出队并放在一个List中,每一层都对应一个List。如第一层是[3],第二层是[9,20],第三层是[8,13,15,17],把这三个List,也就是小结果集都整合放入到一个大List中,如第一层是[3],第二层是[9,20],第三层是[8,13,15,17],不妨将存放了一层的元素的List称为“小结果列表”,区分于最终返回的List<List>.//每一层的元素遍历完之后,在进入下一层之前,将保存该层元素结果的小列表放入大列表尾部,同时将isOrderLeft改变。

2023-08-04 00:19:10 176 1

原创 灵魂之问:二叉树的前中后序遍历,你真的掌握了吗?

第三轮 :在第二轮中我们又得到了2树的左子树的后序遍历序列[8,7,6,5,4,3]和中序遍历序列[3,4,8,6,7,5],所以根节点为3,又推导出中序[],3,[4,8,6,7,5],后序[],[8,7,6,5,4],3,依此类推......3.回到后序遍历得到的序列8,7,6,5,4,3,2,10,15,14,13,12,11,9,1。[8,7,6,5,4,3,2] , [10,15,14,13,12,11,9] , 1中,[8,7,6,5,4,3,2]是后序遍历左子树得到的序列。

2023-07-31 14:19:36 50 1

原创 猴子也能懂的Java双指针——绝对详细的双指针去重分析(附Leetcode80拓展)

然后slow++,并将fast遍历到的新值赋给arr[slow],这样arr[fast]根据是否==arr[slow]继续前进,直到不是arr[slow]的值为止。也许你会说,这个简单,在while(fast< arr.length)的循环中,先用while(arr[fast] == arr[slow] ) fast++ 来寻找新值fast,在赋给arr[++slow]不就可以了么?= arr[slow]时,arr[fast]才能放入arr[++slow]中,这样才能确保重复元素只保留一个。

2023-07-29 21:11:43 254 1

原创 坑很多的Java数组增删

/原来有size个元素,下标从0到size-1,所以一直到下标size-2都要拿后一位元素的值。//如果数组中存放元素数超过或者等于了数组大小,就不能插入元素了,返回-1。//如果判断都大于原数组中元素就插入到size索引的位置,所以初始化为size。//遍历原数组中所有元素,如果key>元素就与下一个比,一直到key<当前元素。//那么这个当前元素的下标就是key要插入的位置,保存当前待插入位置的索引。//删除该元素也就是从该元素的后一位起往前挪一位覆盖原来的元素。//保存删除元素的下标。

2023-07-28 09:19:34 42 1

原创 算法通关村第二关总结——指定区间链表反转(非常详细!)

所以,让一个cur指针指向2,每当拿出一个待操作节点(如下面第一图中的5),就先让2节点的next指向4,再把5节点插入到反转区间的头部,这样,下一次获取待操作节点(此时为4)时,只需要用cur.next就能得到节点,以此类推。所以我们定义一个区间前的节点(此处为7)为pre,利用该节点进行区间中的头插法,还要定义上面说的cur,此外,每一次循环都拿出cur.next作为待操作节点,并在这一步之后改变cur.next的指向,引向下一个待操作的节点。//保存前驱节点,即第left-1节点的引用。

2023-07-24 19:59:39 65

原创 那些年我们纠结过的手撕链表反转

因为pre是cur的前驱结点,所以pre这时指向原链表最后一个节点,即,反转链表的头结点。如上,如果你还没有保存4的引用就让3的next指向2,那么4就会没有引用,我们就无法获得这个节点了。我们在代码中看到,我们实现反转,是通过操作cur的next指针域实现的。你看,掌握节点指针域如何变动,移步操作的进行,while循环的退出条件,返回值的把握,单链表反转你还会忘记吗?给你一个单链表的头结点head,要你实现链表反转,并返回反转后链表的头结点。首先我们需要明白,1节点的next域原来是不为null的,

2023-07-21 20:42:47 116 1

原创 猴子也能看懂的Java数据结构与算法——单链表元素删除解析及高频面试题

这里我们使用双指针法,先让快慢指针步差为K+1,然后快慢指针同步移动,这样当快指针指向链表末尾的null时(你也可以理解成链表最后一个元素是倒数第1节点,最后一个元素的null指针域是倒数第0节点),即快指针指向倒数第0个节点时,因为步差K+1,所以这时慢指针指向倒数第K+1个节点,也就是前驱节点。那回到之前所说的,把cur.next.next赋值给cur.next,这也就是说,让cur.next也指向后继结点。//如果值相同,则删除cur.next, cur不移动,和下一个cur.next继续比较。

2023-07-21 01:40:25 383 3

原创 没有最细,只有更细——全网最易懂的Java链表教程之一(算法村第一关总结)

注意,第一个结点,count==1.然后每一次node = node.next,也就是指向下一个节点的时候,count总会同步的++。//这里的val是当前节点的值,next指向下一个节点。//else表明node指向了key节点,应该插在key节点后面,这时问题要讨论情况,需要考虑key节点是否有后继结点,如果key节点是最后一个节点就没有后继结点。//最后结束循环时,要么node.data == key,即node指向了值为Key的结点,要么没找到值为key的节点,即node == null。

2023-07-17 20:43:29 296

空空如也

空空如也

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

TA关注的人

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