![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Data structure and algorithm
richard_w0ng
这个作者很懒,什么都没留下…
展开
-
Manacher算法理解
插入特殊符号#和&的预处理过程不解释,只解释最核心的内容。正文: 表示(经过预处理之后)字符串 中第 个字符的回文子串长度,因此 即为原字符串 中最长回文子串的长度(容易验算,不解释) :当前最长回文子串中心位置 :当前最长回文子串的右边界位置结论:如果 ,那么 看不懂没关系,我先翻译成人话: 如果i点包含在当前最长回文子串之中(肯定要包含,不然求个鬼),那么i点的回文子串长度为...原创 2018-05-18 14:03:57 · 93 阅读 · 0 评论 -
【leetcode】343. 整数拆分、【leetcode】70. 爬楼梯
343.整数拆分动态规划:将原问题拆解成若干子问题,同时保存子问题的答案,使得每个子问题只求解一次,最终获得原问题的答案大部分动态规划问题本质上都是递归问题,只是在递归的过程中,会发现所谓的“重叠子问题”和“最优子结构”(通过求子问题的最优解,可以获得原问题的最优解)对于同时拥有重叠子问题和最优子结构的问题,考虑两种解决方式:1、记忆化搜索(自顶向下解决问题,较容易实现) 2、动态规...原创 2018-08-14 17:13:05 · 541 阅读 · 0 评论 -
跳坑汇总
目录IDEA如何回到欢迎页面idea导入项目,不显示项目结构IDEA如何回到欢迎页面在没有设置之前,IDEA会默认打开上次的项目工程。选择菜单File -> Settings -> Appearance & Behavior ->System Settings,取消 Reopen last project on startup (在启动的时候打开上...原创 2018-08-14 17:14:36 · 192 阅读 · 0 评论 -
【Data Structure】堆和堆排序 [part 1]
堆和堆排序 [part 1] 4-1 为什么使用堆 4-2 堆的基本存储 4-3 Shift Up 4-4 Shift Down 4-5 基础堆排序和Heapify二叉堆本质上是一种完全二叉树,它分为两个类型:1.最大堆2.最小堆什么是最大堆呢?最大堆任何一个父节点的值,都大于等于它左右孩子节点的值。什么是最小堆呢?最小堆任何一个父节点的...原创 2018-08-18 15:39:10 · 118 阅读 · 0 评论 -
【Data Structure】堆和堆排序 [part 2]
堆和堆排序 [part 2] 为什么使用堆 4-2 堆的基本存储 4-3 Shift Up 4-4 Shift Down 4-5 基础堆排序和Heapify队列的特点是先进先出(FIFO)。优先队列不再遵循先入先出的原则,而是分为两种情况:最大优先队列,无论入队顺序,当前最大的元素优先出队。最小优先队列,无论入队顺序,当前最小的元素优先出队。比如有...原创 2018-08-18 15:41:00 · 110 阅读 · 0 评论 -
【Data Structure】高级排序问题 [part 1]
高级排序问题 [part 1]●归并排序法●归并排序法的递归实现(自顶向下)●归并排序法的优化●归并排序法的非递归实现(自底向上)1 归并排序法1.1 原理:首先将数组分成左右两个部分,考虑将左边和右边的数组分别排序,再归并在一起,递归使用该操作1.2 时间复杂度使用二分法,达到O(logn)的层级,每个层级使用O(n)时间复杂度的算法进行操作,最终...原创 2018-08-17 12:15:53 · 111 阅读 · 0 评论 -
【Data Structure】高级排序问题 [part 2]
高级排序问题 [part 2]●快速排序法●随机化快速排序法●双路快速排序法●三路快速排序法●归并排序和快速排序的衍生问题 1 快速排序法每次从当前排序的数组中选择一个元素,以该元素为基点,考虑将其移动到排好序情况下应该处在的位置(该元素之前的元素都小于该元素,该元素之后的元素都大于该元素),再对左右两个子数组递归使用快速排序//对arr[l...r]...原创 2018-08-17 12:16:32 · 133 阅读 · 0 评论 -
【leetcode】6. Z字形变换
6. Z字形变换使用flag代表方向,每次从上至下来回循环,以行数4为例,索引index的变化情况是0 1 2 3 2 1 0 1 2 3 2... ...每次都将相应行数的数组中增加一个原字符串中的i字符,注意边界判定 参考资料:https://github.com/richardw0ng/LeetCode/blob/master/docs/Leetcode_Solutions/...原创 2018-09-02 09:50:17 · 182 阅读 · 0 评论 -
【leetcode】46. 全排列
46. 全排列使用回溯法class Solution {private: vector<vector<int>> res;//设置一个私有的变量保存排列的结果 vector<bool> isUsed;//判断当前的元素i是否在p中 /*p中保存了一个有index个元素的排列 向这个排列的末尾添加第index+1个元素,获得一个有i...原创 2018-09-06 15:42:51 · 159 阅读 · 0 评论 -
优先队列优先队列优先队列优先队列
优先队列优先队列优先队列那么,优先队列又是什么样子呢? 优先队列不再遵循先入先出的原则,而是分为两种情况: 最大优先队列,无论入队顺序,当前最大的元素优先出队。最小优先队列,无论入队顺序,当前最小的元素优先出队。 比如有一个最大优先队列,它的最大元素是8,那么虽然元素8并不是队首元素,但出队的时候仍然让元素8首先出队:...原创 2018-09-26 20:35:33 · 322 阅读 · 0 评论 -
归并排序,几乎和归并排序一样,不同的地方在于将两个有序数组合并的地方需要添加几行代码。
题利用归并排序,几乎和归并排序一样,不同的地方在于将两个有序数组合并的地方需要添加几行代码。所以我们要找出规律,举例如下: 在归并两排序数组时,当需要将前一个数组元素的指针 i 指向的元素插入时,它对应的 count[i] ,就是后一个数组的指针j 的值count: 0 0 0 0 0 0 0 0nums: -7 1 5 9 -2 1 3 5 ...原创 2018-09-29 09:01:43 · 237 阅读 · 0 评论 -
并不基础的基础——计算机网络笔记
并不基础的基础——计算机网络笔记复习了一段时间的基础知识,略有所得,所以准备开这么一个坑,记录一些在学习计算机网络过程中的体会。还是老样子,我不准备把这个博客写成百度百科,我只想跳脱出基础概念,把实际的应用场景代入进去,总之就是再深入一点TCP协议和UDP协议有什么区别?传输控制协议 TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制,...原创 2019-07-23 22:11:40 · 154 阅读 · 0 评论 -
spark streaming 检查点机制
一个Streaming应用程序要求7天24小时不间断运行,因此必须适应各种导致应用程序失败的场景。Spark Streaming的检查点具有容错机制,有足够的信息能够支持故障恢复。支持两种数据类型的检查点:元数据检查点和数据检查点。(1)元数据检查点,在类似HDFS的容错存储上,保存Streaming计算信息。这种检查点用来恢复运行Streaming应用程序失败的Driver进程。(2)数...原创 2019-07-31 21:38:32 · 240 阅读 · 0 评论 -
剑指Offer刷题笔记
33、【树】判断一个后序遍历序列是否是二叉搜索树(二叉搜索树:左<根<右)解法:递归。根据后序遍历的性质,最后一个数字是根节点。首先需要找到左右字数的分界点。遍历数组,找到第一个大于root的位置即为左右子树分界点,从分界点开始继续遍历,如果出现小于root的值,表示右子树不满足二叉搜索树定义,直接返回false。否则继续递归判断左子树和右子树是否是二叉搜索树。边界条件:空树...原创 2018-05-19 19:47:15 · 175 阅读 · 0 评论 -
【leetcode】3. 无重复字符的最长子串
3. 无重复字符的最长子串整体思路: 用一个unorder_map来保存字符串中每个字符所对应的最近一次出现位置,用字符串本身作为map的key设一个k和i,k用来表示最长子串的起始位置,i用来表示顺序遍历的当前位置,max_len用来保存当前最长子串长度遍历字符串如果当前字符没有出现过(map[key] == 0),则置map的value为当前位置i如果当前字符已经出现过...原创 2018-08-02 08:55:07 · 89 阅读 · 0 评论 -
【Data Structure】二叉搜索树 [part 2]
二叉搜索树 [part 2]●二叉搜索树的顺序性●二叉搜索树的局限性●一种特殊的平衡二叉树:红黑树●平衡二叉树和堆的结合:Treap●Trie树(字典树) 7 二叉搜索树的顺序性1、容易找到一组数据中的min和max2、容易找到一组数据中的前驱和后继(要找A的前驱和后继,首先A要是二叉搜索树中的一个节点)3、容易找到一组数据中的floor和ceil(要找A...原创 2018-08-09 15:43:02 · 107 阅读 · 0 评论 -
桶排序的简单理解
桶排序桶排序(BucketSort)算法也是一种经典的以空间换时间的算法。首先给定一定数量的桶,每个桶涵盖了一个数值区间。当所排序的元素属于该区间,就将该元素分配到这个桶中,然后再使用插入排序算法,对每个桶分别排序,最后将每个桶中的元素输出桶排序的动画可以看到动画以30作为一个区间桶排序过程1.初始化装入连续区间元素的n个桶,每个桶用来装一段区间中的元素2.遍...原创 2018-05-18 14:05:51 · 715 阅读 · 0 评论 -
【Data Structure】红黑树理解
1.什么是红黑树 我们知道一棵高度为h的二叉搜索树的大部分操作时间复杂度是O(h),但是如果搜索树较高,极端情况下就是一条链表了,二叉搜索的意义就不大了。而红黑树是一颗二叉搜索树,也是多种平衡搜索树的一种,可以保证最坏情况下时间复杂度为O(lgn)。对于一棵有n个内部节点的红黑树的高度最多为2lg(n+1),高度的证明不难,请参考算法导论。 2.红黑树的五大性质 这五大性质非常...原创 2018-05-14 09:02:25 · 122 阅读 · 0 评论 -
【leetcode】19. 删除链表的倒数第N个节点
19. 删除链表的倒数第N个节点常规方法,遍历两次不讲,只讲如何扫描一次完成删除利用双指针+虚拟头结点第一个指针first先单独前移n-1位(注意不是n位,自己理解一下),移动完n-1位之后,cur指针开始与first指针同时移动(这里为了完成接下去的删除操作,所以使用了pre保存cur的前一个节点)指针一直移动,之后first到达最后一个节点,此时cur指针指向的位置就是倒数第n...原创 2018-06-13 19:06:28 · 84 阅读 · 0 评论 -
【leetcode】1. 两数之和
1. 两数之和这道题和编程之法上面的题目有以下几个不同: 1、题目所给定的数组是无序的,编程之法里面是默认有序的 2、要求输出原数组的序号,如果用一个结构体维护数组下标,那么需要O(n)的空间,显然不是最好的方法 3、题目中包含负数,之前想用数值直接表示数组下标,数组值为原来的真正数组下标,但是由于是负数,所以这个方法也失效了 4、有重复数值,同样是之前的用数组来存储原...原创 2018-05-28 11:03:07 · 211 阅读 · 0 评论 -
【leetcode】14. 最长公共前缀
14. 最长公共前缀1.strs为空(无字符串),或第一个字符串str[0]为空串,则返回空串; 2.若strs的大小为1,即只有一个字符串,则该字符串本身就是这个字符串数组本身的最长公共前缀; 3.若不满足以上两种情况,则依次比对第1个字符串和其他所有字符串的第1个字符、第2个字符、第3个字符...第i个字符...直到某个字符串长度小于i+1,或者第i个字符不匹配,则返回第1个字符串...原创 2018-06-15 15:36:27 · 219 阅读 · 0 评论 -
【leetcode】349. 两个数组的交集
349. 两个数组的交集最简单的暴力解法,使用set容器,set容器的特点是不会有重复的元素,当有重复的元素存进去时只会保存一个。先把A数组中的元素存入set中,再遍历B数组,查看set中是否有相同的元素注意迭代器的使用和set数组find()函数的用法 C++语言中的set和map底层就是一个平衡搜索树,插入、查找、删除操作的时间复杂度都是O(logn)还有一种经典的set和m...原创 2018-06-16 15:41:42 · 147 阅读 · 0 评论 -
【leetcode】205. 同构字符串
205. 同构字符串先判断这两个字符串长度是否相同,如果不相同,那么肯定不是同构字符串如果长度相同,再继续判断两个字符串是不是完全相等,这是一个小优化(判断相等O(n) < O(nlogn))使用两个map容器分别存储两个字符串的值,遍历两个容器,如果两个字符都是第一次插入,那么返回值均为NULL如果是同构,那么返回的是上次插入相同值的位置,这个位置应该要一样 这是一种很巧妙的...原创 2018-07-13 14:58:46 · 325 阅读 · 0 评论 -
【leetcode】451. 根据字符出现频率排序
451. 根据字符出现频率排序将字符串中的数组降序排列 首先通过一个map存储字符串中每个字符对应的频率,再将字符与其频率组成一个pair,存到vec_pair容器中通过设置cmp函数,对频率进行排序并输出,完成!这道题有很多知识点,比如auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型make_pair是将两个属性合成一个pair对 使用优先队列? ...原创 2018-07-28 21:04:26 · 575 阅读 · 0 评论 -
【leetcode】80. 删除排序数组中的重复项 II
80. 删除排序数组中的重复项 II采用双指针 (似乎要求扫描一遍的方法大多可以采用双指针解决) 要明确一点,k指针所指位置的数值没有任何意义,因为既然它已经被k指针指向了,说明这就是一个“不合法”的位置,最终只能被替换需要比较数值的是i与i的前一位数,分为“合法”和“不合法”两种情况。“合法”情况中又存在着两种情况:1、两数相同,count<2 2、两数不同 ...原创 2018-07-28 21:16:04 · 599 阅读 · 0 评论 -
【leetcode】206. 反转链表
206. 反转链表简单题:使用三个指针:pre、cur和next需要注意的是,当访问链表中的某一个域,如value,首先需要保证该节点不为空,所以这里把next指针的定义放到while循环中,保证了cur不为空,相对应的cur->next也是有意义的class Solution {public: ListNode* reverseList(ListNode* he...原创 2018-07-29 09:42:13 · 155 阅读 · 0 评论 -
【leetcode】86. 分隔链表
86. 分隔链表建两个链表来保存小于x和大于等于x的数,遍历链表,再将两个链表连接 这里需要注意一点,题目只分为两个部分,一个是小于x, 一个是大于等于x,所以不需要存在一个分隔点x在两个链表中间class Solution {public: ListNode* partition(ListNode* head, int x) { ListNode* le...原创 2018-07-29 09:50:16 · 435 阅读 · 0 评论 -
【leetcode】83. 删除排序链表中的重复元素
83. 删除排序链表中的重复元素删除一个元素的情况比较简单,使用两个指针pre和cur,当pre和cur指向的数值val相等时,代表出现了重复节点,删除之考虑两个特殊情况,第一个是head为空节点,第二个是head->next为空节点 class Solution {public: ListNode* deleteDuplicates(ListNode* head...原创 2018-07-29 09:54:47 · 113 阅读 · 0 评论 -
【Data Structure】二叉搜索树 [part 1]
二叉搜索树 [part 1]●二分查找法●二叉搜索树●插入新节点(递归实现)●查找●前中后序遍历●层序遍历(广度优先遍历)●删除节点1 二分查找法二分查找法只能作用在一个有序的序列中,时间复杂度为O(logn)/*非递归形式实现二分查找在有序数组arr中,查找target如果找到target,返回相应的索引index,如果没有找到target,返...原创 2018-08-09 15:42:13 · 157 阅读 · 0 评论 -
Leetcode刷题笔记
空原创 2018-05-19 19:51:12 · 101 阅读 · 0 评论