- 博客(28)
- 资源 (1)
- 收藏
- 关注
原创 数组中第K大的数字
数组中的第K个最大元素。给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4。只需要把快速排序的代码稍微修改就行,把大的元素放在前面。输入: [3,2,1,5,6,4] 和 k = 2。
2023-08-22 16:41:34 172
原创 快速排序的过程
快速排序基本思想是 :通过一个标记pivot元素将n个元素的序列划分为左右两个子序列left和right,其中left中的元素都比pivot小,right的都比pivot的大,然后再次堆left和right各自再执行快速排序,在将左右子序列排好序之后,整个序列就有序了。这里排序进行左右划分的时候是一直划分到子序列只包含一个元素的情况,然后再递归返回。我们可以看到26最终被放到了属于自己的位置上,不会再变化。而左侧的都比15小,左侧都比15大,因此26的左右两侧可以分别再进行排序。
2023-08-22 16:30:30 296
原创 算法通关村——二分查找在找缺失数字中的应用
剑指offer题目: 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。对于有序的也可以用二分查找,这里的关键点是在缺失的数字之前,必然有nums[i]==i,在缺失的数字之后,必然有nums[i]!因此,只需要二分找出第一个nums[i]!=i,此时下标i就是答案。若数组元素中没有找到此下标,那么缺失的就是n。
2023-08-20 22:36:04 166
原创 算法通关村—轻松搞定合并二叉树
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。如果两个二叉树的对应节点都不为空,则合并后的二叉树的对应节点的值为两个二叉树的对应节点的值之和,此时需要显性合并两个节点。如果两个二叉树的对应节点只有一个为空,则合并后的二叉树的对应节点为其中的非空节点;如果两个二叉树的对应节点都为空,则合并后的二叉树的对应节点也为空;
2023-08-13 16:44:38 94
原创 算法通关村—迭代实现二叉树的后序遍历
有没有发现,new_swq与前序遍历很像,前序遍历是先中间,再左边,然后右边,而这里是先中间,再右边,然后左边,只要把代码顺序改一下就可以了。最后将此反转就可以得到后序遍历的结果。如下图,我们先观察后序遍历的结果是seq={9 5 7 4 3},如果我们将其整体反转的话就是new_seq={3 4 7 5 9}。最好理解的方法:反转法。
2023-08-11 10:39:28 47
原创 深入理解前中后序遍历
通过二叉树可以非常方便的理解递归,递归只处理当前这一层和下一层之间的关系,并不关心下层和下下层之间的关系,这就像老子只管养好儿子,至于孙子怎么样,那是儿子的事,你也不能瞎掺合。
2023-08-10 23:08:00 43
原创 算法通关村—原来如此简单
LeetCode 107.给定一个二叉树,返回其节点值自底向上的层序遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)。思路:遍历完每一层节点后,将储存该层结点的列表添加到结果列表的头部。二叉树的层序遍历-自底向上。
2023-08-09 22:10:32 49 1
原创 算法通关村—如何使用中序和后序来恢复一颗二叉树
中序的划分:[3 4 8 6 7 5 2 ]1 [10 9 11 15 13 14 12]中序:3 4 8 6 7 5 2 后序:8 7 6 5 4 3 2。中序:3 4 8 6 7 5 后序:8 7 6 5 4 3。中序: [8 6 7] 5 后序:[8 7 6] 5。中序: 4 8 6 7 5 后序:8 7 6 5 4。中序: 8 6 7 5 后序:8 7 6 5。中序: 8 6 7 5 后序:8 7 6 5。中序:[3 4 8 6 7 5] 2。
2023-08-08 15:34:56 54
原创 算法通关村—队列实现栈问题解析
创建两个队列queue1和queue2,入栈操作时,首先将元素入队到 queue2,然后将 queue1的全部元素依次出队并入队到queue2,此时 queue2的前端的元素即为新入栈的元素,再将 queue1和queue2互换,则 queue1的元素即为栈内的元素,queue 1的前端和后端分别对应栈顶和栈底。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
2023-08-06 16:42:12 101
原创 算法通关村—队列问题解析
队列的特点是节点的排队次序和出队次序按入队时间先后确定,即先入队者先出队,后入队者后出队,即我们常说的FIFO(first in first out)先进先出。队列实现方式也有两种形式,基于数组和基于链表。对于基于链表,因为链表的长度是随时都可以变的,实现起来比较简单。
2023-08-06 15:40:38 39
原创 算法通关村—计算器问题解析
解决运算器问题,最好的工具就是栈。由于乘除优先于加减计算,因此不妨考虑先进行所有乘除运算,并将这些乘除运算后的整数值放回原表达式的相应位置,则随后整个表达式的值,就等于一系列整数加减后的值。给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。
2023-08-04 23:22:02 41 1
原创 算法通关村—最小栈问题解析
此方法要创建辅助栈,例如2,1,3,4 的入栈时,需要创建辅助栈,其中元素依次为2,1,1,1。设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。void push(int val) 将元素val推入堆栈。int getMin() 获取堆栈中的最小元素。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。MinStack() 初始化堆栈对象。
2023-08-04 23:14:59 73 1
原创 数组中出现次数超过一半的数字
根据数组特点,数组中有一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现的次数之和还要多。当遍历到下一个数字的时候,如果与result相同,则次数加1,不同则次数减一,当次数变为0的时候说明该数字不可能为多数元素,将result设置为下一个数字,次数设为1。这样,当遍历结束后,最后一次设置的result的值可能就是符合要求的值(如果有数字出现次数超过一半,则必为该元素,否则不存在),因此,判断该元素出现次数是否超过一半即可验证应该返回该元素还是返回0。首先,用排序行不行?
2023-08-03 16:36:45 84
原创 算法通关村——删除数组元素,双指针的妙用
给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。要求:不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。1.原地移除所有数值等于 val 的元素。2.删除有序数组中的重复项。
2023-08-03 16:28:19 102
原创 算法通关村——不简单的数组增删改查
思路:先找到要增加元素的下标index,再将index后的元素往后移动,最后赋值给下标为index的数组赋值。思路:找到要删除的元素的下标index,然后将index后的元素往前移动,size减去1.
2023-07-25 17:01:53 37
原创 链表反转最难的问题——K个一组反转
如果虚拟结点理解了,会发现头插法比上面的穿针引线法更好理解,主要思路还是将其分成已经反转、正在反转和未反转三个部分。为了方便循环,我们可以先遍历一遍数组,统计一下元素数量len,确定要分几组n=len/k,然后再采用与3.1.1小节一样的思路进行反转就可以了。
2023-07-25 16:00:46 68
原创 寻找环状链表的入口
先说结论先按照快慢方式寻找到相遇的位置(假如为下图中Z),然后将两指针分别放在链表头(X)和相遇位置(Z),并改为相同速度推进,则两指针在环开始位置相遇(Y)。因此此时让slow从Z继续向前走,temp从起点开始走,两个同时开始走(两个每次都走一步),一次走一步那么它们最终会相遇在y点,正是环的起始点。分别用fast、slow表示快慢指针,slow每次走一步,fast就走两步,直到在环中的某个位置相会,假如是图中的Z。那么我们可以知道fast指针走了a+b+c+b步,slow指针走了a+b步。
2023-07-25 15:28:20 87
原创 算法通关村第二关——两两交换链表的结点问题解析
思路:结合图来分析,temp=dummy作为辅助结点,循环内第一次运行,temp.next指向node2,node1.next指向node2.next,node2.next指向node1。接下来关键的一步是将temp往后移动,即temp=node1,也就是temp与3结点相邻,在循环第二次的执行中,node1=temp.next 将node1指向3,node2=temp.next.next将node2指向4。给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。
2023-07-20 15:30:56 103
原创 算法通关村第一关|链表经典问题之删除链表元素笔记
思路如下:遍历链表,等到当前结点的下一个结点的值等于给定的值时,执行删除 pre.next = pre.next.next;方法一:先遍历一遍链表,找到链表总长度L,然后重新遍历,位置L-N+1的元素就是我们要删的。输入:head = [1,2,6,3,4,5,6], val = 6。问题:给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。输入:head = [1,2,3,3,4,4,5]输入:head = [1,1,2,3,3]输出:[1,2,3,4,5]输出:[1,2,3]
2023-07-18 17:31:12 209 1
原创 MAVEN配置
The JAVA_HOME environment variable is not defined correctly,this environment variable is needed to run this program.
2023-02-24 23:55:41 675
原创 Java9之后显示newInstance()已经过时
newInstance()已经过时了应该使用getConstructor().newInstance()Class<?> userClass = Class.forName(“Reflection.User”);Object o1 = userClass.newInstance();Object o2 = userClass.getConstructor().newInstance();
2022-03-27 21:25:01 1366
原创 Toolkit.getDefaultToolkit().getImage(Panel.class.getResource())在Java17中返回NullPointerException
初学Java,遇到一些问题一、问题1、环境:win11,java17 & java82、跟着教程学习java,在使用Toolkit.getDefaultToolkit().getImage(Panel.class.getResource())导入图片的时候,老师可以正常运行,我的代码运行时却报空指针。在这里插入图片描述bomb-1.gif,bomb-2.gif,bomb-3.gif放在out/production/chapter16下,与com平级。getResource()中资源名是带
2022-03-11 21:07:41 1609 13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人