- 博客(26)
- 收藏
- 关注
原创 算法通关村——理解堆在合并链表中的应用
如果我们了解堆的性质,我们可知道在堆中可以按大小给我们排序,所以我们就可以在合并多个链表中的时候运用到堆结构。
2023-09-09 00:41:52 196
原创 算法通关村——原来这就是堆结构
堆是将一组数据按照完全二叉树的存储顺序,将数据存储在一个一维数组中的结构。堆有两种结构,一种称为大顶堆,一种称为小顶堆,如下图。小顶堆:任意节点的值均小于等于它的左右孩子,并且最小的值位于堆顶,即根节点处。大顶堆:任意节点的值均大于等于它的左右孩子,并且最大的值位于堆顶,即根节点处。有些地方也叫大根堆、小根堆,或者最大堆、最小堆都一个意思。大和小的特征等都是类似的,只是比较的时候是按照大还是小来定,我们本音在原理方面的个绍就按照最大堆来进行,后面的题目再根据情况来定。
2023-09-08 00:42:52 219
原创 算法通关村——数组实现加法问题解析
先看一个用数组实现逐个加一的问题。LeetCode66.具体要求是由整数组成的非空数组所表示的非负整数,在其基础上加一。这里最高位数字存放在数组的首位,数组中每个元素只存储单个数字。并且假设除了整数 0之外,这个整数不会以零开头。
2023-09-06 11:18:44 329
原创 算法通关村——溢出问题解决处理模板
溢出问题是一个极其重要的问题,只要涉及到输出一个数字,都可能遇到,典型的题目有三个: 数字反转,将字符串转成数字和回文数。不过溢出问题一般不会单独考察,甚至面试官都不会提醒你,但他就像捕捉猎物一样盯着你,看你会不会想到有溢出的问题,例如这道题是一个小伙伴面美团时拍的。所以凡是涉及到输出结果为数字的问题,必须当心!
2023-09-06 00:38:24 188
原创 算法通关村——反转字符串里面的单词的问题分析
LeetCode151 给你一个字符串 s ,逐个反转字符串中的所有 单词单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开请你返回一个反转 s 中单词顺序并用单个空格相连的字符串。对于字符串可变的语言,就不需要再额外开辟空间了,直接在字符串上原地实现。解释:输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。输出:"blue is sky the"输入: s ="hello world"反转后的字符串中不应包含额外的空格。输出:"world hello"
2023-09-04 21:38:51 73
原创 算法通关村一不简单的字符串转换问题
LeetCode8.本题的题目要求比较长,看原文:请你来实现一个 myAtoi(string s)函数,使其能将字符电转换成一个 32 位有符号整数(类似 C/C++中的 atoi函数)。
2023-08-30 22:04:44 63
原创 算法通关村——位运算的高频考题
我们要判断一个数的二进制中有多少个1,最简单的方式就是在循环中与1进行与运算之后判断是否为1,然后1<<1,这样子就可以完成目标了。但是不够不够简练,首先我们要知道一个规律。所以每一次n和(n-1)进行与运算都可以将一个1消掉。所以我们可以这么做。
2023-08-30 13:33:42 162
原创 算法通关村——位运算的常用技巧
首先我们先简单的了解一下位运算,众所周知,我们的数据是以二进制的形式储存在我们的计算机中的。位运算是计算机的核心基础,数据的表示和计算几乎都少不了,在JVM以及很多高性能代码里大量使用,甚至很多算法本身就是基于位进行的。在算法方面,很多位相关的算法有很多技巧,不学真不知道。另外很多算法虽然看起来与位运算无关,但是用位操作优化一下,性能会提升很多,所以位运算的问题值得好好学习。
2023-08-29 22:44:29 176 1
原创 算法通关村——透彻了解二分查找
当我们没有了解二分查找法的时候,我们面对在有序数组查找元素只能从索引0开始一个一个慢慢的遍历,这样子时间复杂度会很高,所以我们需要学习二分查找法,让我们的代码更加高效。除了上述的循环法,还有迭代法,不过都是大同小异。
2023-08-13 16:56:38 217 1
原创 算法通关村——轻松搞定N叉树的最大深度
我们可以通过迭代返回出每个根节点的子节点的深度值,然后定义个成员变量max,然后每次迭代完就与max比较,得到较大值,将根节点的子节点遍历一遍,我们就可以得到根节点的最大深度值。所以,我们可以在第一个判断根节点是否为空,若为空就直接返回0,若根节点的子节点为空,则直接返回1.然后就是根节点不为空,这样子我们就将根节点的三种情况清楚的区分了出来。在这道题中首先确定迭代的结束条件,结束条件就是节点没有子节点。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。给定一个 N 叉树,找到其最大深度。
2023-08-08 22:27:15 155
原创 算法通关村——轻松搞定二叉树的路径问题
在这个问题中,我们拿到一棵树的根节点,需要返回所有路径的集合。例如:输入:[1,2,3,null,5] 输出:["1->2->5","1->3"]我们可以使用迭代法,迭代的终点就是没有子节点的时候。
2023-08-07 18:32:05 142 1
原创 算法通关村——迭代法
二叉树的前序遍历的顺序是中左右,所以呢,我们需要将在节点放进栈的时候就将节点的值放在数组中。我们可以一直遍历左子树,一直遍历无子树,然后从后往前,遍历右子树,这里我们可以倒推使用什么数据结构来存储节点,所以我们使用的是栈。
2023-08-06 00:02:02 70
原创 算法通关村——如何使用中序和后序来恢复一颗二叉树
中序: [3 4 8 6 7 5 2 ]1 [10 9 11 15 13 14 12]后序: [8 7 6 5 4 3 2 ][10 15 14 13 12 11 9] 1。中序:左中右:1 4 2 5 7 6 8。后序:左右中:1 2 4 7 8 6 5。中序:[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。中序:4 [8 6 7 5]后序:[8 7 6 5] 4。后序:[8 7 6] 5。中序:[8] 6 [7]
2023-07-30 13:05:03 79 1
原创 算法通关村——栈和hash的经典算法
也可以使用双层循环+Hash来实现,首先按照第一题两数之和的思路,我们可以固定一个数target,再利用两数之和的思想去map中存取或查找(-1)*target - numlj],但是这样的问题是无法消除重复结果,例如如果输入[-1,0,1,2,-1,-4],返回的结果是[[-1,1,0,[-1,-1,2,[0,1,-1],[0,-1,1],[1,-1,0],[2,-1,-1]],如果我们再增加一个去重方法,将直接导致执行超时。你可以按任意顺序返回答案。输出: [[-1,-1,2],[-1,0,1]]
2023-07-28 19:03:07 138 1
原创 算法通关村——hash和队列的基础知识
哈希 (Hash)也称为散列,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,这个输出值就是散列值。并且不同的明文很难映射为相同的 Hash 值。哈希为什么访问的时间复杂度是O(1)呢?因为哈希以一定规律将数值放在一个列表中,列表中每个结构下面都有很多个值,在搜索某个值时可以直接找到在列表中的位置,然后再内部在搜索。这里会产生一个疑问?那会不会在查询的时候产生冲突呢?
2023-07-25 15:04:06 199
原创 算法通关村——部分栈的问题的分析
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。示例 1:输入:s = “()”输出:true示例 2:输入:s = “([]){}”输出:true示例 3:输入:s = “(]”输出:falses 仅由括号 ‘()[]{}’ 组成。
2023-07-24 11:53:40 135
原创 算法通关村——如何基于数组和链表实现栈
在讲解如果基于数组和链表实现栈之前,我们要先了解栈。Java的util包就提供了stack类,常见操作有这些。push(E):增加一个元素Epop0:弹出元素Epeek0:显示栈顶元素,但是不出栈empty0:判断栈是否为空。
2023-07-21 16:37:06 154 1
原创 算法过关村第三关——数组的增删改查
如果实在有序的数组中查找元素可以使用二分法(假设数组是递增数组),如果没有则返回插入位置的索引。数组的增操作是最基础的操作,但是里面还是有着许多的细节。(假设在一个递增数组)
2023-07-18 21:51:26 64 1
原创 算法通关村第二关——链表区间反转问题解析
在做链表区间反转的题目之前要先学会链表的反转,具体可见。链表区间反转有两种方法,一:头插法,二:穿针引线法。
2023-07-17 21:45:15 438 1
原创 算法通关村第二关——链表反转
联立虚拟节点:ListNode ans = new ListNode(-1),且ans.next = head.算法的关系来了,就是我们需要设一个变量ListNode cur = head;直接转变链表的方向,看图。依次执行就可以反转链表。
2023-07-17 19:34:34 462 1
原创 算法通过村第一关——链表黄金挑战笔记(链表中环结构)
我们先定义几个变量,a为链表中非环的链表长度,b是快慢节点是在距离环入口b相遇的, c是相遇节点距离环入口的距离。若快节点在一圈中追上慢节点,则快节点的路程是a+b+c+b,慢节点的路程是a+b,且快慢节点有快节点的路程是慢节点的两倍的关系。既然我们知道了这个关系,我们只需要慢节点从相遇节点出发,一个节点从头结点出发,以相同的速率前进,他们相遇的地方就是环的入口。可以使用快慢指针,一旦链表中存在环,这就会变成追及问题,只有有环,快节点就会追上慢节点。
2023-07-16 23:35:56 192 1
原创 算法通过村第一关——链表白银挑战笔记
这时候有两种情况,两个链表长度不同和两个链表长度相同,若两个链表长度相同,则可以通过一次遍历来找到第一个公共节点,若两个链表长度不同,设第一个链表非公共链表的长度是a,第二个的非公共链表的长度是b,则需要遍历|a-b|+1次才能找到第一公共节点。(只需要了解个思路)先分别计算两个链表的长度,这时候我们可以知道两个链表长度相差x,这时候长的链表线性x步,再同时遍历,就可以找到第一个公共节点。链表向右移k位,k的值可能大于链表长度,所以我们只需要旋转k%len次,若k%len=0,则不需要旋转链表。
2023-07-16 22:42:00 527 1
原创 算法通过村第一关——链表青铜挑战笔记
2)删除尾部节点,我们可以使用cur.next.next来判断,如果为null,可以将cur.next设置成null,这样以来就就可以将尾结点删除。我们上面分析的是单向链表,我们只能通过上一节点来获取下一节点的信息,不能从下一节点来获取前一节点的信息。,我们可以先将新节点的prev和next信息设置好,然后修改新节点的前一节点的next和后一节点的prev指向新节点。链表是一种数据结构,他是由一个个节点组合而成的,节点包含了该节点的数据和指向下一个节点的地址。将新节点的next指向他的后一节点,
2023-07-16 14:25:24 596 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人