- 博客(16)
- 收藏
- 关注
原创 二叉树的层级遍历
zigzagLevelOrder交叉逆序返回每层列表。levelOrderDESC倒序返回每层的列表。simpleLevelOrder广度优先遍历。nLevelOrder返回n叉树的每层列表。levelOrder返回每层的列表。
2023-08-14 21:56:24 67
原创 二叉树的结构和常见概念
节点的度:一个节点所有子节点的个数为该节点的度树的度:树中的最大的节点的度叶节点、终端节点:度为0的节点非终端节点、分支节点:度不为0的节点树的深度:树的层数。
2023-08-14 19:57:12 86
原创 Hash和双向链表实现LRU
插入与查询算作使用,被使用的数据放到表头,不怎么被使用的数据就被使用的数据移到表尾。类似于FIFO算法,不同点在于,如果表内数据被使用,就将被使用数据移到表头。LRU算法为最近最久为使用,当空间满时,将最久未使用的数据释放。双向链表可以方便的找到表头和表尾以及附近的结点。HashMap可以通过key快速寻找所需数据。
2023-07-31 22:32:49 207 1
原创 栈和队列的互相实现以及n数之和
进行遍历,先确定一个数nums[first],如果nums[first]==nums[first-1]&&first>0,说明值相同,使用continue遍历下一个值;当second<third&&nums[third]+nums[second]>target时,third--,如果second==third,退出second的循环,如果nums[second]+nums[third]==target,找到一组答案。第一层for循环确定一个数nums[i],第二层for循环确定另一个数nums[j]。
2023-07-29 23:12:33 70
原创 Hash基础和队列基础
hash的存储计算公式为模运算,若数组array存放1到15到一个大小为7的hash表中,存储位置计算公式为:index=number mod 7。将Hash表的每个单元作为链表的头结点,出现碰撞就将输入值作为index位置的链表的下一个结点。若要查找13则index=13%7=6,直接访问array[6],时间复杂度为O(1)。当不同的输入值算出的存储位置相同时,称为碰撞,例如1和8的index均为1。hash扩容机制:到达hash长度的0.75就将长度拓展为原来的2倍。发生了碰撞就寻找下一个空的地址。
2023-07-29 21:18:30 23
原创 栈的运算器、逆波兰式计算
读取到运算符进行运算前需要得到两个数字,preSign先为'+',将第一个数字和0进行相加的和num后压入栈,再读取后一个运算符preSign = 新的运算符,继续读取下一个数字,根据preSign运算后压入栈。逆波兰式按顺序运算,将数字入栈,读取到运算符就pop()两次得到要运算的两个数字,在将运算结果入栈。加减运算直接用x和-x入栈,乘除运算需要和输出的栈顶元素进行运算后入栈。给与字符串表达式s="3+2*2"
2023-07-28 22:16:03 21 1
原创 栈的括号、最小、最大问题
minStack.peek():x),可以在初始化时minStack.push(Integer.MAX_VLAUE),或者在每次push()时判断stack是否isEmpty(),没有则直接minStack.push(x),否则进行判断。使用map来记录key(左括号)和value(右括号),遇到左括号就入栈,遇到右括号就与栈顶元素比较,不匹配则return false。leetcode20:给定一个只包括'(',')','[',']','{','}',的字符串s,判断字符串是否有效。
2023-07-28 21:45:46 27 1
原创 数组与双指针
将元素加入set集合中,因重复加入时而失败时,删除要加入元素的对应元素,最后剩下的元素为出现了一次的元素。二进制位运算,异或结合律,相同为0,相异为1,两个相同的数异或后得0,0异或其它数仍为其它数。找到nums[right]==0,与nums[left]进行交换,left++;找到nums[right]==1,与nums[left]进行交换,left++.当times==0时,改变result,再令times=1;如果nums[1]==nums[0],times+1;
2023-07-27 23:30:52 34 1
原创 算法通关村——数组的增删查改
数组array从0开始记录,设长度为length,第一个为array[0],最后一个为array[length-1]。数组中的个数为size,size可能和length不一样,可能100的空间只用了10。
2023-07-26 15:51:33 64 1
原创 算法通关村第二关——链表反转问题解析
新建虚拟头结点dummy,dummy.next=head,新建结点pre,pre为left的上一个结点,新建cur结点,cur为当前操作结点(从left到right),新建next结点,next为cur的下一个结点,next=cur.next,cur.next = next.next, next.next=pre.next, pre.next=next。输入:1,2,3,4,5 left=2,right=4。输入:1,2,3,4,5,6,7,8,9。输出:2,1,4,3,6,5,8,7,9。
2023-07-20 22:10:45 33
原创 链表中的环问题
快指针的路程为A->B->C->B->C->B->......->C,慢指针的路程为A->B->C->B->......->C,x+y+(z+y)*n=2(x+y),n*z+(n-1)y=x,(n-1)(y+z)+z=x,(n-1)len+z=x[len为环的长度],即从链表头开始到环入口位置 与 快慢指针相遇位置到环入口位置+(n-1)个环的长度(在环入口位置再走n-1个环的长度仍在环入口的位置)相等。快慢指针速度差为一次走一步,且快指针速度为慢指针的两倍,所以若有环,则快指针一定会与慢指针相遇。
2023-07-20 20:25:32 24
原创 算法通关村第二关——终于学会链表反转了
新建结点newHead获得递归方法返回的结点,这层递归的head.next.next=head,head.next=null(反转head和head.next),这层反转完成,返回newHead(newHead为这层反转链表的头结点)。遍历cur,令next=cur.next,cur.next=pre(cur成为反转链表头结点),pre=cur(pre也成为了反转链表头结点),cur=next,最后返回pre。对未反转的链表进行遍历,将元素作为反转链表的头结点1<-2<-3<-4 5->null。
2023-07-20 12:31:35 24
原创 算法通关村第一关——链表经典问题之白银挑战笔记
1、先遍历链表得到长度len,k=k%len,需要将进行链表拼接,先寻找旋转后的头结点,fast先走k步,slow与fast再同时走,fast.next走到null时,slow走到倒数第k+1个元素,即旋转后头结点前一个结点,获取slow.next结点(旋转后头结点post),slow.next=null,fast.next=head,返回post。1、创建一个新链表,将两个有序链表进行遍历,比较val值,将更小的结点接入新链表,相同则都接入新链表,一个链表遍历完后,将另一个链表剩下部分都接入新链表。
2023-07-18 15:38:55 314 1
原创 算法通关村第一关——链表青铜挑战笔记
current不等于last,则current的next的prev为插入结点,插入结点的next为current的next,插入结点的prev为current,current的next为插入结点。若插入位置在1之后,需先得到插入位置的前一个结点pNode,pNode的next置为插入结点,插入结点的next置为pNode的next,返回链表。若增加在表尾,且链表为空,则first与last均为插入结点;链表不为空,则last的next置为插入结点,插入结点的prev置为last,再令last置为插入结点。
2023-07-16 21:05:48 221 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人