Hello 算法
文章平均质量分 94
算法学习指南,包含整理的文章和刷题记录,参考宫水三叶博主、《算法(第四版)》、《算法导论》和《Hello 算法》等技术书籍
方圆想当图灵
怕什么真理无穷,进一寸有进一寸的欢喜
展开
-
算法学习心得
这篇文章是我学习算法的心得,希望它能够给一些将要学习算法且准备要读大部头算法书籍的朋友一些参考,节省一些时间原创 2024-02-25 19:23:45 · 1747 阅读 · 0 评论 -
关于双指针算法问题的思考
本篇是对双指针算法的总结,我将它分成了数组和字符串类型的题目,大家可以按照文章题目的顺序进行练习,如果大家想要找刷题路线的话,可以参考。原创 2023-10-23 09:29:15 · 99 阅读 · 0 评论 -
滑动窗口算法技巧
在我刷了一些滑动窗口相关的题目之后,发现很有技巧性,只要掌握了解题思路,就会很简单,所以我决定用这篇帖子记录一下,也帮助同样在刷滑动窗口相关题目的同学。原创 2023-10-09 21:29:02 · 328 阅读 · 0 评论 -
二分查找是偏爱细节的魔鬼
二分查找本质上是一个规模退化且固定规模减小一半的分治算法,它的。通常我们会认为二分查找的应用场景是数组有序(单调),但实际上它也能在无序数组中应用,限制二分法使用的并不是数组是否有序,而是,只要一段满足某个性质,另一段不满足某个性质,那么就可以使用二分法。本篇内容我想带大家更好地理解二分查找,不再根据模版生搬硬套,也不再对条件判断中的等号云里雾里。如果大家想要找刷题路线的话,可以参考。原创 2024-03-05 09:47:15 · 1070 阅读 · 0 评论 -
从 LinkedHashMap 源码到手撕 LRU 缓存
最近在刷 LeetCode 上LRU缓存的题目,发现答案中有 LinkedHashMap 和自己定义双向链表的两种解法,但是我对 LinkedHashMap 相关源码并不清楚,所以准备学习和记录一下。如果大家想要找刷题路线的话,可以参考。原创 2023-09-10 09:56:49 · 510 阅读 · 0 评论 -
手撕 LFU 缓存
LFU 的缩写是 Least Frequently Used,简单理解则是将使用最少的元素移除,如果存在多个使用次数最小的元素,那么则需要移除最近不被使用的元素。LFU 缓存在 LeetCode 上是一道困难的题目,实现起来并不容易,所以决定整理和记录一下。原创 2023-09-18 09:49:42 · 322 阅读 · 0 评论 -
单调栈和单调队列可以很简单
我觉得单调栈和单调队列的题目很有特点,而且理解了它的特点能够很轻松容易地解决一系列题目,所以决定用这篇帖子记录一下,也想以此来帮助在刷同样类型题目的朋友们。原创 2023-09-25 09:13:17 · 121 阅读 · 0 评论 -
一文搞懂优先队列及相关算法
大家好,我是。优先队列在 Java 中的定义是 PriorityQueue,它基于数据结构实现,其中的元素并不是全部有序,但它能够支持高效地。二叉堆是一种特定条件的,树的根节点为堆顶,最右端叶子节点为堆底,分为和。小顶堆堆顶元素最小,且任意节点小于等于其子节点,大顶堆堆顶元素最大,且任意节点大于等于其子节点,如下图所示:完全二叉树只有叶子节点未被填满,且叶子节点从左向右进行填充。优先队列可以用于解决和,下面我们先来看一些练习。如果大家想要找刷题路线的话,可以参考。原创 2023-11-06 09:31:57 · 364 阅读 · 0 评论 -
时间复杂度为 O(n^2) 的排序算法
对于小规模数据,我们可以选用时间复杂度为 O(n) 的排序算法,因为时间复杂度并不代表实际代码的执行时间,而且它也省去了低阶、系数和常数,仅代表的增长趋势,所以在小规模数据情况下, O(n) 的排序算法可能会比 O(nlogn) 的排序算法执行效率高。不过随着数据规模增大, O(nlogn) 的排序算法是不二选择。本篇我们主要对 O(n) 的排序算法进行介绍,在介绍之前,我们先了解一下算法特性::经排序后,若等值元素之间的相对位置不变则为稳定排序算法,否则为不稳定排序算法。原创 2023-10-16 09:13:21 · 829 阅读 · 0 评论 -
时间复杂度为 O(nlogn) 的排序算法
在上文实现中,我们在每次合并两个有序数组时,即使是很小的数组,我们都会创建一个新的 temp[] 数组,这部分耗时是归并排序运行时间的主要部分。:分解待排序的 n 个元素的序列成各具 n/2 个元素的两个子序列,将长数组的排序问题转换为短数组的排序问题,当待排序的序列长度为 1 时,递归划分结束。在数组有大量重复元素的情况下,快速排序的递归性会使元素全部重复的子数组经常出现,而对这些数组进行快速排序是没有必要的,我们可以对它进行优化。快速排序有很多优点,但是在哨兵划分不平衡的情况下,算法的效率会比较低效。原创 2023-10-30 09:13:17 · 637 阅读 · 1 评论 -
时间复杂度为 O(n) 的排序算法
本文介绍线性排序,即时间复杂度为 O(n) 的排序算法,包括桶排序,计数排序和基数排序,它们都不是基于比较的排序算法,大家重点关注一下这些算法的适用场景。原创 2024-02-03 18:08:16 · 1954 阅读 · 0 评论 -
树专题 —— 二叉树前序遍历
本篇关于二叉树的前序遍历,主要由题目进行展开,如果大家想要找刷题路线的话,可以参考。原创 2023-11-13 20:27:20 · 183 阅读 · 0 评论 -
树专题 —— 二叉搜索树和中序遍历
int key;int val;Node left;Node right;// 根节点Node root;原创 2023-11-06 09:33:36 · 688 阅读 · 0 评论 -
树专题 —— 二叉树后序遍历
本篇关于二叉树的后序遍历,依然是由题目来展开,如果大家想要找刷题路线的话,可以参考。原创 2023-11-23 15:58:43 · 146 阅读 · 0 评论 -
树专题 —— 二叉树层序遍历
本篇关于二叉树的层序遍历,主要以题目为主,而且我觉得层序遍历是求解二叉树问题中最简单的,学会了基本的层序遍历,在这基础上的扩展题也能迎刃而解,如果大家想要找刷题路线的话,可以参考。原创 2023-12-04 09:10:46 · 209 阅读 · 0 评论 -
深入理解回溯算法
本篇我们来讲回溯。回溯相当于穷举搜索,它会尝试各种可能的情况直到找到一个满足约束条件的解,寻找解的手段一般通过DFS实现,是一个增量构造答案的过程。原创 2024-05-06 19:54:04 · 1145 阅读 · 1 评论 -
深入理解树状数组
关于各类区间和问题有很多种解法,我们可以根据题目要求选择解题的方向:、树状数组和线段树和线段树和线段树数组区间修改,区间查询:线段树树状数组是其中能解决问题最多的,而且它相比于线段树代码量更少更简单,是我们。在本文我们对线段树进行介绍,并在文末附上相关的习题供大家练习。如果大家想要找刷题路线的话,可以参考。原创 2023-08-28 09:11:30 · 106 阅读 · 0 评论 -
深入理解线段树
线段树是常用的维护的数据结构,它可以在 O(logn) 的时间复杂度下实现单点修改、区间修改、区间查询(区间求和、区间最大值或区间最小值)等操作,常用来解决 RMQ 问题。RMQ(Range Minimum/Maximum Query) 问题是指:对于长度为 n 的数列 A,回答若干询问 RMQ(A, i, j) 其中 i, j原创 2023-09-05 10:01:53 · 138 阅读 · 0 评论 -
树专题 —— 深入理解左倾红黑树
上文我们已经规定,被红链接引用的节点为红色,被黑色链接引用的节点为黑色,我们在节点中添加colorTrue表示红色,Falseint key;int value;Node left;Node right;/*** 判断节点是否为红色*/} else {原创 2023-12-04 09:08:49 · 1001 阅读 · 0 评论 -
树专题 —— 深入理解经典红黑树
本篇我们讲红黑树的经典实现,Java中对红黑树的实现便采用的是经典红黑树。前一篇文章我们介绍过左倾红黑树,它相对来说比较简单,需要大家看完上篇再来看这一篇,因为旋转等基础知识不会再本篇文章中赘述。原创 2023-12-18 09:03:47 · 954 阅读 · 0 评论