算法小结


时间复杂度 随着数据量的增加,程序所消耗的时间变化趋势 O(1),O(logn),O(n),O(nlogn),O(n^2)....
空间复杂度 随着数据数量增加 产生的额外空间消耗的变化趋势 同上

链表问题:
单双休链表
链表旋转问题:首选设置哨兵链表头,防止头部链表丢失,然后使用pre,current,next 三个指针进行next遍历,链表反转一定要注意一点,防止节点相互指向,所以一开始一定要将head节点的next置为null
链表复制:1使用map复制,2,直接在链表上新增节点,在迁出

栈问题:秉承着先进先出,两个做队列,求最小值,数的遍历都适合使用

补充一个前缀和数组,申明一个长度较比较数组大于一的数组,方便使用,然后依次将前面所知值和与当前值相加结果放入数组中,最后得到的一个有序的结果集,两两差值等于原数组下标指向值之和(描述的有点模糊啊,还好我自己很明白)

队列:先进先出 二叉树的分层遍历,单方向视角类似题目都可以使用队列,非常适用于广度优先搜索

二分法:二分法的使用,首先需要保证数据是有序的,然后通过大小比较不断取中值。如果有数据求和的,返回的是数据下标的数据结构,建议使用hashMap,通过与目标值的求差与key对比

双指针,双指针适用的场景,一定是数据有顺序趋势的,这样通过star,end的指针对比,然后做指针移动,移动的结果值一定可预见的变大或者变小

排序:
冒泡排序:暴力排序,每一个数都要循环与后一个数进行对比。
插入排序:思想就是和前面的数据一个个比下去,因为前面已经是有序的了,所以只要比较到比自己小的位置插入就好
选择排序:思想就是每次寻找到最小的那个值,进行替换就可以了,替换的次数比冒泡小,就是把最小的往前扔
快排:思想就是取一个值,然后基于这个值不断的将数组区分,每次区分都能保证昨天的数组都小于比较值,右边大于比较值,递归处理,最后得到的就是有序数组
归并排序:思想就是将数组先分成最小单位,然后合并过程中进行排序,这样最后合并出来的就是有序数组

tree 主要是二叉查找树,对数的遍历,有递归左右排序,或者使用栈,数的结构放入数组中,数组1下标存放根节点,然后依次存放左右,这样的方式可以序列化和反序列化树结构

红黑树 :一种稳定深度的数据结构,特性是根节点一定是黑色,相邻节点不能是红色,叶子节点不存值,每次插入的节点都是红色节点,然后通过左旋和右旋的方式,保证插入之后树结构的稳定。

heap 堆 最大堆 最小堆 java实现ProrityQueue,可以不断的拿到最大值或者最小值,求中位数这样的算法可以选择大小堆合并使用

广度优先 bfs 主要针对图结构,与队列配合使用

深度优先 dfs 递归

trie 字典树 数据结构设计个数据结构 包含当前值,以及childer集,是否为完整的word属性值

并查集 将所有有关系的节点,指向最高层级的父节点,这样减少检索的时间复杂度,类似于小岛问题,只要满足条件就将两个节点的父节点拉平,这样结束发现所有的节点只有一个父节点,也就只存在一个小岛

动态规划: 所有根据前面步骤决定当前步骤结果的问题,都是动态规划问题,降低空间复杂度的话 配合滚动数组使用

posted @   好好的一个居士  阅读(57)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示