自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法通关村十六关——滑动窗口经典问题

【代码】算法通关村十六关——滑动窗口经典问题。

2023-12-09 22:12:41 457

原创 算法通关村十六关——滑动窗口

在数组双指针里,有“对撞型”和"快慢型”两种方式,而滑动窗口思想其实就是快慢型的特例。在与流量控制、熔断、限流、超时等场景下都会首先从滑动窗口的角度来思考问题,例如nystrixⅸ、sentinel等框架都使用了这种思想。如下图所示,假如窗口的大小是3,当不断有新数据来时,我们会维护一个大小为3的一个区间,超过3的就将新的放入老的移走。1.如果是固定的,则一般会让你求哪个窗口的元素最大、最小、平均值、和最大、和最小等等类型的问题。2.如果窗口是变的,则一般会让你求一个序列里最大、最小窗口是什么等等。

2023-12-09 21:57:04 516

原创 算法通关村十五关——超大规模数据场景的问题

从左到右遍历数组words,当遍历到Word1时,如果已经遍历的单词中存在word2,取最后一个已经遍历到的Word2所在的下标。同理,当遍历到word2时,应该取最后一个已经遍历到的Word1所在的下标。用index1和index2分别表示数组words已经遍历的单词中的最后一个word1的下标和最后一个word2的下标,当遇到word1或者word2时就更新下标。第二种方式是采用选择排序的方式,首先遍历10亿个数字找最小,然后再遍历一次找第二小,然后再一次找第三小,直到找到第100万个。

2023-12-09 21:05:40 504

原创 算法通关村十五关——海量数据场景下的热门算法题

用bit map的方式来表示数出现的情况,是申请一个长度为4294967295x2的bit类型的数组bitArr,用2个位置表示一个数出现的词频,遍历这40亿个无符号数,如果初次遇到num,就把bitArr[num*2+1]和bitArr[num*2]设置为01,如果第二次遇到num,就把bitArr[num*2+1]和bitArr[num*2]设置为10,如果第三次遇到num,就把bitArr[num*2+1]和bitArr[num*2]设置为11。67108864*37+i就是没出现过的数。

2023-12-09 20:52:48 475

原创 算法通关村十五关——用4KB内存寻找重复元素

在海量数据中,此时普通的数组、链表、Hsh、树等等结构有无效了,因为内存空间放不下了。而常规的递归、排序,回溯、贪心和动态规划等思想也无效了,因为执行都会超时,这里介绍三种非常典型的思路:1.使用位存储,使用位存储最大的好处是占用的空间是简单存整数的1/8。例如一个40亿的整数数组,如果用整数存储需要16GB左右的空间,而如果使用位存储,就可以用0.5GB的空间,这样很多问题就能够解决了。

2023-12-09 20:01:21 416

原创 算法通关村十四关——堆能高效解决的经典问题

排序:升序用小,降序用大。拿走根节点后进行重排,然后在继续拿走根节点,重复该操作,取出的数据就是拍好序的。1.K多大就建立多大固定大小的堆。3.只有比根元素大的才让进入堆。

2023-12-09 19:44:00 329

原创 算法通关村十四关——堆结构

将元素插入到保持其为完全二叉树的最后一个位置,然后顺着这条支路一直向上调整,每前进一层就要保证其子树都满足堆否则就去处理子树,直到完全满足要求。堆是将一组数据按照完全二叉树的存储顺序,将数据存储在一个一维数组中的结构。堆有两种结构,一种称为大顶堆,一种称为小顶堆,如下图。·小顶堆:任意节点的值均小于等于它的左右孩子,并且最小的值位于堆顶,即根节点处。·大顶堆:任意节点的值均大于等于它的左右孩子,并且最大的值位于堆顶,即根节点处。2、当i>=1时,父节点为(i-1)/2。1、当i=0时,为根节点。

2023-12-09 19:27:56 317

原创 算法通关村十三关——数论问题

【代码】算法通关村十三关——数论问题。

2023-12-09 19:11:28 344

原创 算法通关村十三关——数字与数学高频问题

【代码】算法通关村十三关——数字与数学高频问题。

2023-12-09 19:06:15 373

原创 算法通关村十三关——数字与数学基础问题

【代码】算法通关村十三关——数字与数学基础问题。

2023-12-09 18:34:17 523

原创 算法通关村十二关——字符串冲刺题

【代码】算法通关村十二关——字符串冲刺题。

2023-12-09 16:57:32 437

原创 算法通关村十二关——字符串经典基础面试题

【代码】算法通关村十二关——字符串经典基础面试题。

2023-12-09 16:41:53 375

原创 算法通关村第十二关——不简单的字符串转换问题

【代码】算法通关村第十二关——不简单的字符串转换问题。

2023-12-09 16:19:46 387

原创 算法通关村十一关——位运算的高频算法题

【代码】算法通关村11关——位运算的高评算法题。

2023-12-09 15:59:37 446

原创 算法通关村十一关——理解为运算的规则

该方法与setBit相反,首先将1左移i位获得形如00010000的值,对这个值取反进而得到类似11101111的值,接着对该值和num执行”位与",故而不会影响到um的其余位,只会清零i位。·分配律:(a&b)|c=(a|c)&(b|c),(a|b)&c=(a&c)|(b&C),(a⊕b)&c=(a&c)⊕(b&c);·结合律:(a&b)&c=a&(b&c),(a|b)|c=a|(bIc),(a⊕b)⊕c=a⊕(b⊕c);·德摩根律:~(a&b)=(~a)I(~b),~(aIb)=(~a)&(~b);

2023-12-09 15:28:41 372

原创 算法通关村第九关——透彻理解二叉树中序遍历的应用

如果LA[k/2-1]LB[k/2-1],则可以排除LB[0]到LB[k/2-1]。也就是一次砍掉一半。数,即比LA[k/2-1]小的数最多只有k-2个,因此LA[k/2-1]不可能是第k个数,LA[0]到。·如果LA[k/2-1]或者B[k/2-1]越界,那么我们可以选取对应数组中的最后一个元素。·如果LA[k/2-1]=LB[k/2-1],则可以归入第一种情况处理。

2023-11-11 22:29:38 161

原创 算法通关村第九关——二分查找与搜索树的高频算法题

注意,数组[a[0],a[1],a[2],,a[n-1]旋转一次的结果为数组[a[n-1],a[0],a[1,a[2],,a[n-2]。对于有序的也可以用二分查找,这里的关键点是在缺失的数字之前,必然有ums的==,在缺失的数字之后,必然有nums[!那这个题要考什么呢?解释:原数组为[0,1,2,4,5,6,7],旋转4次得到输入数组。解释:原数组为[1,2,3,4,5],旋转3次得到输入数组。·若旋转4次,则可以得到[4,5,6,7,0,1,2]·若旋转7次,则可以得到[0,1,2,4,5,6,7]

2023-11-11 17:33:52 183

原创 算法通关村第九关——透彻理解二分查找

在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问是成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题…直到最后子问题可以简单的直解,原问题的解即子问题的解的合并。二分查找每次查找就排除一半的元素,时间复杂度为O(logn)

2023-11-11 11:33:11 59

原创 算法通关村第八关——寻找最近公共祖先问题

3.当right为空,let不为空时,先判断一下root是不是p或者q,如果是说明q和p一个是另一个的祖先,直接返回就好了,否测说明right子树里什么都没查到,此时需要递归的去左子树查即可。6的祖先结点有3和5,7的是3、5、2,所以6和7的最近公共祖先是5。·2.如果left和right都不为null,说明p和q分别在root的两侧,直接返回root即可。(1)p和q在root的子树中,且分列root的异侧(即分别在左、右子树中);·4如果Ieft为空,而right不为空,说明是与情况3相反的情况。

2023-11-11 11:12:38 103

原创 算法通关村第八关——二叉树的深度与高度问题

【代码】算法通关村——二叉树的深度与高度问题。

2023-11-11 10:48:29 133 1

原创 算法通关村第八关——二叉树的经典算法问题

【代码】算法通关村第八关——二叉树的经典算法问题。

2023-11-09 09:44:50 94 1

原创 算法通关村第七关——迭代实现二叉树的前、中、后遍历

【代码】算法通关村第七关——迭代实现二叉树的前、中、后遍历。

2023-11-09 08:45:05 152 1

原创 算法通关村第六关——二叉树层次遍历经典问题

【代码】算法通关村第六关——二叉树层次遍历经典问题。

2023-11-09 08:35:28 182 1

原创 算法通关村第六关——如何使用中序和后序来恢复一颗二叉树

/定义二叉树int val;//定义N叉树int val;数组存储二叉树父节点的数组下表是i,那么它的左孩子就i*2+1,右孩子就是ⅰ*2+2。

2023-11-08 20:04:47 50 1

原创 算法通关村第五关——LRU的设计与实现

如果key不存在,使用key和value创建一个新的节点,在双向链表的头部添加该节点,并将key 和该节点添加进哈希表中。然后判断双向链表的节点数是否超出容量,如果超出容量,则删除 双向链表的尾部节点,并删除哈希表中对应的项;通过哈希表定位到该节点在双向链表中的 位置,并将其移动到双向链表的头部,最后返回该节点的值。Hash的作用是用来做到O(1)访问元素,双向链表用来实现根据访问情况进行排序,靠近头部的键值对是最近使用的,而靠近尾部的键值对是最久未使用的。

2023-11-08 11:58:22 170 1

原创 算法通关村第五关——队栈和Hash的经典算法题

为了满足栈的特性,即最后入栈的元素最先出栈,在使用队列实现栈时,应满足队列前端的元素是最后入栈的元素。出栈操作只需要移除queue1的前端元素并返回即可,获得栈顶元素操作只需要获得queue1的前端元素并返回即可(不移除元素)。queue:2的前端的元素即为新入栈的元素,再将queue1和queue2互换,则queue1的元素即为栈内的元素,queue1的前端和后端分别对应栈顶和栈底。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop和empty)。

2023-11-06 17:07:14 119

原创 算法通关村第五关——Hash与队列的特征

队列的特点是节点的排队次序和出队次序按入队时间先后确定,即先入队者先出队,后入队者后出队,即我们常说的FIFO(first in first out)先进先出。队列实现方式也有两种形式,基于数组和基于链表。开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。将哈希表的每个单元作为链表的头结点,所有哈希地址为的元素构成一个同义词链表。哈希(Hash)也称为散列,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,这个输出值,就是散列值。

2023-11-06 16:29:17 122

原创 算法通关村第四关——栈的表达式问题

【代码】算法通关村第四关——栈的表达式问题。

2023-11-06 11:30:07 151

原创 算法通关村第四关——栈的经典问题解析

【代码】算法通关村第四关——栈的经典问题解析。

2023-11-06 11:24:24 87

原创 算法通关村第四关——基于数组实现栈

peek():显示栈顶元素,但是不出栈。push(E):增加一个元素E。empty():判断栈是否为空。pop():弹出元素E。栈的特性是后进先出。

2023-11-06 11:08:34 149

原创 算法通关村第三关——数组双指针的扩展

【代码】算法通关村第三关——数组双指针的扩展。

2023-11-06 10:56:18 91

原创 《算法通关村第三关一一双指针的妙用》

从下面序列中删除重复元素[1,2,2,2,3,3,3,5,5,7,8],重复元素只保留一个。1.首先对整个数组实行翻转,例如[1,2,3,4,5,6,7]我们先将其整体翻转成[7,6,5,4,3,2,1]。3.最后将两个再次翻转就得到[5,6,7]和[1,2,3,4],最终结果就是[5,6,7,1,2,3,4]输入:nums=[1,2,3,4,5,6,7],k=3。向右轮转1步:[7,1,2,3,4,5,6]向右轮转2步:[6,7,1,2,3,4,5]向右轮转3步:[5,6,7,1,2,3,4]

2023-10-30 21:49:30 99 1

原创 《算法通关村第三关一一不简单的数组增删改查》

第二种:每次扩充容量加倍,特点:减少了扩充操作的执行次数,但可能会浪费空间资源。以空间换时间,推荐的方式。第一种:每次固定扩充数量,可称为线性增长。特点:节省空间,但是扩充操作频繁,操作次数多。

2023-10-30 20:45:55 155 1

原创 算法通关村第二关——k个一组反转

LeetCode25.给你一个链表,每k个节点一组进行翻转,请你返回翻转后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。示例1:输入:head=[1,2,3,4,5],k=2输出:[2,1,4,3,5]示例2:输入:head=[1,2,3,4,5],k=3输出:[3,2,1,4,5]

2023-10-30 17:50:39 183 1

原创 《算法通关村第二关——链表指定区间反转问题解析》

对下面序列蓝色区间的链表进行反转。

2023-10-30 17:01:25 246 1

原创 《算法通关村第二关——终于学会链表反转了》

LeetCode206给你单链表的头节点head,请你反转链表,并返回反转后的链表。示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]

2023-10-30 15:12:21 149 1

原创 算法通关村第一关——链表中环的问题

使用双指针,一个快指针fast(一次走两步),一个慢指针slow(一次走一步),当fast到达链表的尾部是,说明没有环,如果存在环,那slow就一定会在某个位置和fast相遇。3)此时让fast回到起点,slow从z继续走,两个同时走(两个每次都走一步),最终在环的入口处相遇,只是fast先在环里转了(n-1)圈。4)此时让fast回到起点,slow从z继续走,两个同时走(两个每次都走一步),最终在y相遇,也就是环的入口。第二种情况,fast和slow相差两个结点,则需要两步后两个指针就相遇了。

2023-10-19 21:10:17 691 1

原创 算法通关村第一关——链表经典问题之双指针专题笔记

我们可以使用快慢指针,让fast先遍历到k+1的结点位置,slow仍然在第一个位置,此时slow和fast就相差了k个结点,此时slow和fast同步走,当fast到达链表的结尾空结点时,slow所指向的就是倒数第k个元素。对于寻找链表中间结点的问题,我们可以用快慢指针来解决,一个slow指针和一个fast指针一起遍历链表,slow走一步,fast走两步,当fast在处于链表的尾部的时候,slow也就处于中间的位置了。把快指针指向的节点连到原链表头部,慢指针指向的节点断开和下一节点的联系。

2023-10-19 15:47:40 758 1

原创 算法通关村第一关——链表青铜挑战笔记

先处理插入结点指向后驱结点new.next=cur.next,然后再处理前驱结点指向插入结点cur.next=new。因为每个结点都只有一个next,先执行cur.next=new的话,链表中原先的cur.next与cur的连接就会断开,new就指向不到链表原先的cur.next。我们遍历找要插入的位置时,需要在目标的前一个位置停下来,也就是前驱结点cur。插入操作前用cur.next的值判断目标的前一个位置而不是cur的值判断,而插入的时候,容易因为插入过程中插入结点的前后指向顺序颠倒而发生错误。

2023-10-19 09:45:29 698 1

空空如也

空空如也

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

TA关注的人

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