算法通关村
文章平均质量分 53
回忆-如初
这个作者很懒,什么都没留下…
展开
-
算法通关村之堆结构(实战训练)经典问题:理解堆的构造、插入、删除过程,查找数组中第K大的元素、堆排序、合并K个有序链表
一般都是删除堆顶元素,将堆顶元素与二叉树最后一个元素对调,删除堆顶元素后,再依次调整每一层的各子树。:确认插入位置能够保持原二叉树为完全二叉树,再自底向上调整,保证每一层的子树都符合堆结构。堆满后,只有比堆顶元素小的元素,才可以插入堆中;新插入的元素先覆盖堆顶元素后,再调整。:堆是一种数据结构,按照完全二叉树的存储顺序,将数据存储在一个一维数组中。:按照层次将所有元素一次添入二叉树中,再不断调整,最终使其符合堆结构。将数组序列依次插入堆中,每插入一个元素,就调整堆使之符合堆的结构。全部序列入堆完毕后,原创 2023-10-01 11:50:15 · 248 阅读 · 0 评论 -
算法通关村之字符串(实战训练)经典问题:反转字符串中的单词、验证回文串、字符串里的第一个唯一字符、判断字符串是否互为重排
就是将其中一个字符串中的字符顺序打乱重新排列后,能否成为另一个字符串。定义一个 Map 集合,我们遍历一遍字符串,使用 Map 记录每个字符出现过的次数。再次比较字符出现次数,只有每个字符出现的次数都一样,才能算两字符串互为字符重排。再使用双指针相向遍历新字符串,遍历的的过程中,判断两指针指向元素是否相同。首先要做的就是遍历一遍字符串,把所有的字母都放到新的字符串中。再次遍历该 Map,取到第一个出现次数大于1的元素。分别统计两个字符串中,各个字符出现的次数。将字符串按空格分开,转换为数组/集合。原创 2023-10-01 11:47:39 · 232 阅读 · 0 评论 -
算法通关村之字符串(实战训练)经典问题:转换小写字母、字符串反转、K个一组反转、仅反转字母
创建一个新的字符串对象,再次遍历该字符串:如果是非字母,将该字符放入新字符串;如果是字母,则从存入弹出的栈顶元素。如果是非字母,则将该字符放入新字符串;如果是字母,则移动后指针,找到字母,将该字母存入新的字符串。定义两个指针,一个从头向后遍历,一个从后向前,维护字母字符。使用双指针,一个在前,一个在后,相向移动,遍历字符串。遍历该字符串,依次转换为小写,存入新的字符串中。在遍历的过程中,将两指针指向的元素交换位置。创建一个新的字符串对象,前指针遍历字符串。遍整个字符串,将字母依次压入栈中。原创 2023-10-01 11:45:24 · 267 阅读 · 0 评论 -
算法通关村之快速排序(基础知识 + 实战训练):简单的快速排序、查找数组第K大数、归并排序
接下来,我们对key的左右区间进行单趟排序,可以预见的是,每次排序都固定好了一个数。在一个无序数组中取一个数key,每一趟排序的最终目的是:让key的左边的所有数小于key,key的右边都大于key(假设排升序)ast每走一步判断一下它指向的元素是否小于key,若小于则交换fast和slow位置的元素,并且让slow向前走。归并排序简单来讲,就是将大的序列视为若干小的数组,利用归并思想实现排序的方法。试想一下,每一轮快排结束之后,我们能知晓基准值的位置,即我们知晓基准值的下标。否则,对右侧进行递归快排。原创 2023-10-01 11:42:31 · 190 阅读 · 0 评论 -
算法通关村第六关- 二分查找和搜索树(基础知识)
直到到达数组左边界,或者 nums[mid] 不等于 target 为止。找到指定元素 target 后,继续向左查找,mid--,了解顺序查找、以及二分查找的简单实现。上面提到的二分查找是最常用的。返回 nums[mid++]原创 2023-10-01 11:35:27 · 79 阅读 · 0 评论 -
算法通关村第五关-二叉树遍历(深度优先)之经典问题: 递归/迭代实现二叉树前、中、后序遍历
前序遍历和中序遍历的代码不复杂,还是注意:挺不好理解的,不要钻牛角尖,那么我们接下来看下后序遍历。你当然可以尝试去理解,也不是很难想明白,但是不要钻牛角尖了,递归这玩意儿,很不友好。前序遍历的顺序是:中、左、右,我们简单该两个参数,实现遍历顺序为中、右、左。再将遍历结果reserve反转,不就得到左、右、中的遍历顺序了吗?理解递归思想:调用自己、压栈、明确终止条件。我的建议是直接把代码背下来。原创 2023-10-01 11:31:15 · 697 阅读 · 1 评论 -
算法通关村第五关-二叉树遍历(层数优先)之经典问题: 锯齿形层序遍历、N叉数层序遍历、获取每一层的最大值/平均数、获取二叉树右视图
在基本的层序遍历的基础上,如何实现锯齿形层序遍历?这里暂时没看懂为什么加了个 queue,日后解答。锯齿形遍历:3 9 8 20 11 6。这样的思路能否完成呢:其他条件不变,,因为它可以提供了不同的入队方式。(2023/09/10午)统计每一层出队的最后一个节点即可。原创 2023-10-01 11:28:39 · 361 阅读 · 3 评论 -
算法通关村第五关-二叉树遍历(层数优先)之经典问题:简单的层序遍历、层序遍历分层、自底向上的层序遍历
层序遍历我们做到了,这里添加一个要求:对层序遍历的节点值分层处理,即二叉树每层的节点值分别存放进一个链表 list 中。重复以上操作,每个节点出对后,都存储该节点值到 list 中,再依次将左右孩子节点入队,直到队列 queue为空。给你一个二叉树根节点,你需要创建一个队列 queue 来遍历节点,一个链表 list 来存储节点的数据域,即值。我们之前层序遍历时,每出队一个节点,都把其值存入 list 链表中,然后入队其孩子节点。在开始出队某一层的节点时,此时队列的节点数,就是二叉树这一层的节点数。原创 2023-10-01 11:25:56 · 366 阅读 · 2 评论 -
算法通关村第四关 - 白银挑战:经典问题之括号匹配问题、最大栈、最小栈、理解栈的特点:先进后出
先入栈1、出栈1,要出栈4,必然是2 3 4依次入栈了,出栈4之后的出栈顺序只能是3 2,而不可能是2 3,故错误。如果该字符s不是key值,即不是左括号,则Stack出栈,计算value值是否与s相等。先出栈2,必然是1已经入栈了,再入栈3、出栈3,入栈4、出栈4,最后出栈1,没有问题。构建两个栈,一个栈存放入栈元素,另一个栈存放栈顶元素对应的此时栈中最小的元素。给你一个栈,依次入栈1 2 3 4,请问以下出栈顺序可能出现吗?依次遍历字符串中的字符s,如果存在Map中的key值与s相等,则入栈。原创 2023-09-13 00:22:19 · 35 阅读 · 0 评论 -
算法通关村第四关 - 栈、队列和Hash:栈的实现
Hash,又称散列,将任意长度的输入,通过散列算法,转换为固定长度的输出。empty():判断栈是否为空。认识栈这个数据结构:先进先出。peek():弹出栈顶元素。push(E e):入栈。碰撞处理(Hash冲突)再哈希法(布隆过滤)原创 2023-09-13 00:16:50 · 66 阅读 · 0 评论 -
算法通关村第三关-白银挑战:双指针解决删除重复元素、删除指定元素、数组元素奇偶移动问题
快慢双指针的思路与上面如出一辙,无非是:快指针寻找的元素不再是与慢指针重复的元素,而是指定元素。如果左指针找到了指定元素,就拿右指针所指元素覆盖,左指针向前移动,右指针向后移动。,则慢指针:先记录快指针指向的值,然后向前移动,快指针继续向前移动。这时,将两指针所指元素交换,右指针向前一步。如果快指针所指元素,与此时慢指针所指元素。如果快指针所指元素,与此时慢指针所指元素。快指针在前,慢指针在后,快指针向前移动。左指针在左,右指针在右,左指针向前移动。),则慢指针等待,快指针继续向前移动。原创 2023-08-15 23:10:59 · 64 阅读 · 0 评论 -
算法通关村第三关-青铜挑战:单调数组问题、简单的二分查找和数组合并问题
我们讨论单调数组的合并:两单调数组合并之后,结果仍然是单调数组。新数组:创建一个新数组,依次比较两数组元素大小,存放。数组单调有两种情况:单调递增、单调递减。原创 2023-08-15 23:07:44 · 32 阅读 · 0 评论 -
算法通关村第三关-青铜挑战:数组元素的插入、删除、查找
数组的基本操作:数组的创建和初始化元素查询插入元素删除元素。原创 2023-08-15 23:04:38 · 75 阅读 · 0 评论 -
算法通关村第二关-链表经典问题:两两交换链表中的节点、链表相加、单链表加一
算法通关村第二关-链表经典问题:两两交换链表中的节点、链表相加、单链表加一原创 2023-08-02 12:31:50 · 114 阅读 · 0 评论 -
算法通关村第二关-链表经典问题:反转区间链表
【代码】算法通关村第二关-链表经典问题:反转区间链表。原创 2023-07-31 12:59:27 · 97 阅读 · 0 评论 -
算法通关村第二关-链表经典问题:反转链表
常见的链表反转的方法:虚拟头节点、直接反转、递归。原创 2023-08-02 12:28:12 · 80 阅读 · 0 评论 -
算法通关村-第一关通关挑战
【代码】算法通关村-第一关通关挑战。原创 2023-07-27 10:24:13 · 39 阅读 · 1 评论 -
算法通关村第一关-双指针专题:寻找中间节点、寻找倒数第K个节点、旋转链表
*** 寻找中间节点* @return*/// 1.快慢指针// 2.快指针指向尾节点= null) {// 3.返回中间节点。原创 2023-07-22 22:57:17 · 40 阅读 · 0 评论 -
算法通关村第一关-链表经典问题:查找公共节点、回文链表判断、合并链表
*** 方法1:全部压栈遍历 全部出栈遍历* @return*/// 1.压栈 遍历= null) {// 2.出栈 遍历= null) {/*** 方法2:全部压栈遍历 一半出栈遍历* @return*///链表的长度//把链表节点的值存放到栈中= null) {len++;//len长度除以2len >>= 1;//然后再出栈。原创 2023-07-19 20:58:14 · 75 阅读 · 0 评论 -
算法通关村第一关-链表经典问题:查找两链表的第一个公共节点
从两链表的头节点/尾节点开始,分别依次向后遍历链表的每个节点,再比较两节点,判断它们是否相同,即是否为两链表的公共节点。哈希和集合:直接消除了链表长度带来的影响,通过开辟了新的空间,判断节点是否相等,进而查找出两链表的公共节点。只需要根据正序/倒序遍历链表,选出第一组公共节点/最后一组公共节点,就找到了两链表的第一个公共节点。栈、两链表拼接、差和双指针:本质上都是构造出两链表长度相同的环境,进而查找出两链表的公共节点。我们上面查找两链表公共节点的思路,其实只有在两链表长度相同时,才行得通。原创 2023-07-18 22:51:31 · 87 阅读 · 1 评论 -
算法通关村第一关-链表青铜挑战笔记
链表,是用来存储数据的一种数据结构,其由若干个节点依次连接而成。一个节点就是一个数据元素,一个节点由两部分构成:数据域和指针域。数据域存放数据元素的值,指针域存放指针,而该指针用来指向下一个节点。原创 2023-07-17 18:43:47 · 488 阅读 · 1 评论