- 博客(31)
- 收藏
- 关注
原创 黄金-数组转为二叉树
分析:BST 的中序遍历是升序的,因此本题等同于根据中序遍历的序列恢复二叉搜索树。因此我们可以以升序序列中的任一个元素作为根节点,以该元素左边的升序序列构建左子树,以该元素右边的升序序列构建右子树,这样得到的树就是一棵二叉搜索树啦~ 又因为本题要求高度平衡,因此我们需要选择升序序列的中间元素作为根节点奥~
2023-08-28 21:46:58
110
原创 白银-二分查找经典问题
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IE81mn5v-1693230285841)(C:\Users\李建伟llx\AppData\Roaming\Typora\typora-user-images\image-20230826213000301.png)]所以只需要判断当前节点的值是否大于前一个遍历到的节点即可。跟普通二分相比,只是将中间值和目标值比较换成了中间值和high处的元素比较.二叉搜索树:左子树的值均小于根节点的值;右子树的值都大于根节点的值。
2023-08-28 21:45:09
108
原创 白银-二叉树的高度和深度
如果已经知道不是平衡二叉树,就没必要继续再递归下去了。如果左右子树均不为空,取左右子树深度最小值。如果左子树为空 : 1+右子树深度。如果右子树为空 : 1+左子树深度。
2023-08-23 00:03:22
46
原创 编程导航第八关-青铜-二叉树的经典算法题
在叶子节点处判断targetSum是否等于root.val;注意终止条件是在叶子节点,而不是null。在非叶子结点不断递归。逐层交换左右子树节点值。
2023-08-22 23:58:52
48
原创 白银-层次遍历
先把右子节点入队列,再把左子节点入队列,那么最后一个出队列的元素就是二叉树最底层最右边的节点。判断每层是否遍历完:用size记录每层元素的总数,size减为0时,表示该层遍历完。原来list里的add方法里加个下标就能在指定位置添加元素,之前一直不知道。就是在层次遍历的基础上,在每一层用一个变量不断比较并进行保存最大值。在bfs的基础上,将每层的最后一个元素加入结果集即可。在基础的层次遍历上进行修改即可。
2023-08-04 12:47:11
46
原创 编程导航算法村第六关-青铜-根据树的前中、中后序列重构二叉树
第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)第五步:切割后序数组,切成后序左数组和后序右数组。这里根据左右子树节点的数量来确定边界。第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点。第一步:如果数组大小为零的话,说明是空节点了。第六步:递归处理左区间和右区间。
2023-08-04 12:46:17
52
原创 白银-栈和hash经典问题
一个队列实现栈,就是每次入队时,将队列中的元素poll,再offer到队列中,这样就实现了先入后出。在三数之和的基础上再多加一层for循环,注意也要进行类似的去重判断;
2023-08-01 12:37:05
51
原创 黄金-数组进阶
异或满足交换律,题目说明除了某个元素只出现一次以外,其余每个元素均出现两次。异或运算满足交换律,所以经过异或运算后最后的结果就是答案。首先想到用set来做,但是题目要求空间复杂度为O(1),所以使用异或运算来做。题目中只要求随便一个重复的数组就可以。三种方法:hash,排序后取中位数,摩尔投票法。最容易理解的做法,冒泡排序加快慢双指针。
2023-07-26 21:51:04
51
1
原创 白银-双指针思想专题
快慢双指针:fast遇到不等时,将值赋给slow并后移slow。1.2.删除有序数组中的重复项2.元素奇偶移动记数组 nums 的长度为 n。先从 nums 左侧开始遍历,如果遇到的是偶数,就表示这个元素已经排好序了,继续从左往右遍历,直到遇到一个奇数。然后从 nums右侧开始遍历,如果遇到的是奇数,就表示这个元素已经排好序了,继续从右往左遍历,直到遇到一个偶数。交换这个奇数和偶数的位置,并且重复两边的遍历,直到在中间相遇,nums 排序完毕。3.轮转数组观察输入和输出,发现只需要进行两次反转即
2023-07-25 12:42:48
53
原创 编程导航第三关-青铜-几个关于数组的基本问题
结果数组中,越往后的数组的元素越大,所以用两个指针分别指向两个数组的末尾,比较大小,将更大的写入结果数组中。思路:一次循环,用两个布尔变量(inc,dec)标识单调增和单调减;
2023-07-25 10:36:35
49
原创 编程导航第二关-白银-链表反转拓展问题
对比头插法,感觉更容易理解,将区间内的一段链表切割出来,同时记录下left的前驱,right的后继,便于反转后修改指向。就是用之前的基本链表反转方法来把两条链表进行反转,在进行加和运算,最后得到的链表需要再次进行反转。因为存在进位的情况,所以我们需要进行逆序相加,也就是要反转链表。使用栈来做,十分容易理解。使用虚拟头节点来做,也叫头插法。就是将反转区间的节点拼接到pre的后面。至于反转的方法就是跟反转整条链表一样了。这里用穿针引线来反转。最容易理解的就是依次两两交换两节点。为什么指向的修改会出现差异?
2023-07-21 19:24:09
107
1
原创 黄金-链表中的环问题
也就是说,在第一次相遇后,fast指向头节点,slow指向第一次相遇出,两者以相同速度前进,相遇时,此处就是环的入口。fast步数是slow的两倍,所以2*(a+b) = a+b+c+b。多圈后相遇也是一样的,区别是a对于c多加了n圈的长度(a=c+(n-1)len)步数:fast = a+b+c+b;slow = a+b;可以用hash或者set来做,思路比较简单。空间复杂度为O(1):使用快慢双指针,
2023-07-21 10:24:48
96
1
原创 白银-链表的几道经典问题解法
fast先移动k步,slow指向头节点,然后同时移动,当fast为null时,slow刚好指向了需要的答案。在寻找中间节点的过程中顺便反转前半部分链表,pre指向slow的前一个节点,prepre指向slow的前一个节点。如果链表的长度是奇数,fast指针会停在最后一个节点上,此时slow指针指向的是链表的中间节点,需要将slow指针向后移动一步,跳过中间节点。slow每次移动一步,fast每次移动两步,当fast指针到达链表的末尾时,slow指针就会在链表的中间。,头节点可能会被删除,使用虚拟头节点。
2023-07-20 23:12:39
118
1
原创 kmp算法
KMP算法一.基本概念字符串匹配。给你两个字符串,寻找其中一个字符串是否包含另一个字符串,如果包含,返回包含的起始位置。主要有两个部分:PMT(参数匹配表),根据PMT进行匹配1.PMT!!! PMT中的值是字符串的前缀集合与后缀集合的交集中最长元素的长度.其值我将之理解为在两个字符串不匹配之前有几个字符是匹配的这些已匹配的字符无需再进行匹配,*具体的做法是将j指针指向模板字符串的PMT[j-1]位2.匹配若匹配则不断将i+1,j+1,直到不匹配为止;再进行***具体的做法***若不匹配
2021-03-24 22:45:56
60
原创 查找算法
一.顺序查找用循环遍历代码示例:package Search;public class 顺序查找 {public static void main(String[] args) {int[] arr= {1,8,6,45,312,520};顺序查找 a=new 顺序查找();int num=a.search(arr,520);System.out.println(num);}public int search(int[] arr,int x) { for(int i=0;i<
2021-02-19 23:31:53
87
原创 递归
对递归的一些理解以及迷宫问题和八皇后代码实现自己调用自己,每次调用新开创一个栈,注意要有终止递归的条件,回溯时会执行调用语句以后的代码。每个栈拥有自己的局部变量,各个栈可能共用一个引用递归实现迷宫代码package 递归;public class MiGong {public static void main(String[] args) { //用数组模拟地图 int[][] map=new int[8][7]; //将四周的墙用1表示 //上下 for(int i=0;i<7
2021-02-16 21:22:24
222
3
原创 龟兔赛跑--判断是否有环
如何检测一个链表是否有环,如果有,那么如何确定环的起点和环的长度。(1)判断是否有环?龟兔解法的基本思想可以用我们跑步的例子来解释,如果两个人同时出发,如果赛道有环,那么快的一方总能追上慢的一方。进一步想,追上时快的一方肯定比慢的一方多跑了几圈,即多跑的路的长度是圈的长度的倍数。基于上面的想法,Floyd用两个指针,一个慢指针(龟)每次前进一步,快指针(兔)指针每次前进两步(两步或多步效果时等价的,只要一个比另一个快就行)。如果两者在链表头以外的某一点相遇(即相等)了,那么说明链表有环,否则,如果(快
2021-02-11 10:35:07
308
1
原创 链表
结合模型仔细理解!!!!!!!!单链表理解头插法和尾插法头插法:将新节点见到头结点之前,并使新结点成为头结点尾插法:遍历链表到最后一个结点,再让最后一个节点指向新节点。头结点不能移动这里借鉴他人的作品单链表的增删查改实现package LinkedList;public class SingleLinkedList2 {public static void main(String[] args) { Node hero1=new Node(1,"宋江","及时雨"); Node h
2021-02-10 11:49:24
152
2
原创 队列
顺序队列和循环对列一.基本概念队列是一个有序列表,可以用数组和链表实现,遵循先入先出的原则front 队首,指向第一个数据前一位,默认值为-1;rear 队尾,指向队列最后一个数据,默认值为-1;maxSize 数组最大长度;二.顺序队列入队rear+1;出队front+1;队列为空:front=rear;队列满: rear=maxSize-1;其缺点为无法循环使用;代码实例:package com.datestructs;import java.util.Scanner;pub
2021-02-05 23:20:12
152
原创 稀疏数组
稀疏数组稀疏数组共有3列,第一行第1列表示原数组中非0元素的行号,第二列表示列号,第三列表示这个非0元素构建步骤遍历原数组,找出非0元素个数,定义一个数组,并给第一行赋值(原数组共几行,共几列,几个非0数)再次遍历原数组,把非0元素行号,列号,该数放入这个数组中代码示例package com.datestructs;public class SparseArrays {public static void main(String[] args) { int[][] a=new int
2021-02-04 23:12:15
109
原创 常用类
博客即笔记,分享笔记,望指正。api帮助文档一.Object1.toStringpublic String toString(){return getClass().getName() + ‘@’ + Integer.toHexString(hashCode())}一般需要重写toString方法package 常用类;public class Demo01 {public static void main(String[] args) {Demo02 a=new Demo02(201
2021-02-03 16:20:24
426
5
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人