基础算法记录(实时更新,记录)

1:数组(列表)

(1)双向指针:

前提:数组是有序

用法:两个指针一前一后,确定好两个指针所指值的关系来调整左右指针的变化朝向

其中要确定好指针什么时候移动是关键

(2)滑动窗口:

遇到返回子数组数目什么的,就要用固定右边看左边的思想

返回长度 值 反正不是子数组数目的,就是枚举右边

主要就是枚举右边,while循环里面是对左指针(l)的操作,记得列表不能超出范围

滑动窗口要考虑单调性,实例如:T560

(3)二分查找:

记住一个例子,找的是>=x的第一个数的位置

其实二分查找不一定需要序列是有序序列,只要在通过比较mid以后能够确定某一部分的元素是否符合要求就行了

(3.1)峰值查找(和mid+1比):

定理:如果 i<n−1 且 nums[i]>nums[i+1],那么在 [0,i] 中一定存在至少一个峰值。而且数组的最后一个元素肯定是确定为蓝色的(峰值或者峰值的右侧),所以不考虑

比较的是m和m+1的大小

(3.2)旋转数组找最小(和最后一个元素比):

(3.3)旋转排序找某个(分类讨论):

抓住染蓝色(mid在target右侧,然后就可以把mid右侧全部删除)的类别,然后仔细分析判断语句怎么写


2:链表

(1)反转链表:

性质:反转结束以后,pre指向反转部分的最后一个节点元素,cur指向反转部分最后一个节点的下一个节点

(2)快慢指针:

定理:长度为奇数的链表,如果快指针在最后一个节点,慢指针一定在中间节点

            。。。偶数。。。,。。。。。。。。。。。。。。。。。。。中间节点的第二个节点

循环退出条件就是:当快指针为空或者下一个为空时结束循环

(2.1)返回环入口

当找到快慢指针相遇点以后,让head指针走,当相等时slow返回的节点即为入口

(3)删除链表

如果需要删除头结点的话才需要加入dummy node

删除重复节点,看当前节点和下一个节点是否一样:

这个题目不需要dummynode的原因是:因为第一个元素不管怎样都不会被删除

这个题目就是要注意删除什么时候停止要考虑清楚


3:二叉树和递归

(1)递归:

循环是会把计算结果返回给一个在循环外的存储单元,但是递归某级返回的值是给上一级用的;

递归最后的尽头,就叫做边界条件

写递归的时候先写边界条件,然后再看判断条件,最后便利左右指针


(2)二叉树:

相同、对称、平衡、右视图

对于我自己来说,其中有一点是判断平衡树的时候,红色框框里面的特别重要:

相当于他可以做到,记录当前节点的高度(就是左右子树最大高度+1)

(3)二叉搜索树:

二叉搜索树就是:节点边的值于节点值,节点边的值于节点值

(3.1)前序遍历:

就是访问节点值 然后递归子树子树这样去遍历,就叫做前序遍历

先判断,再次递归,将节点值的范围往        

(3.1)中序遍历:

先遍历子树 然后访问节点 再遍历子树这样去遍历,就叫做中序遍历

大于上一个节点值

(3.1)后序遍历:

先遍历子树,再遍历子树这样去遍历,然后访问节点,就叫做后序遍历

先递归,再判断,将节点值的范围往

(4)二叉树最近公共祖先:

要把分类想清楚

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值