
数据结构与算法
文章平均质量分 96
以放_
明日将逝!
展开
-
【数据结构与算法】字符串2:KMP & 实现 strStr() & 重复的子字符串
说到KMP,先说一下KMP这个名字是怎么来的,为什么叫做KMP呢。因为是由这三位学者发明的:Knuth,Morris和Pratt,所以取了三位学者名字的首字母。所以叫做KMP。前缀表有什么作用呢?前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配时,模式串应该从哪里开始重新匹配。其中我们会了解到next数组,next数组其实就是一个前缀表(prefix table)。在文本串:aabaabaafa中查找是否出现过一个模式串:aabaaf。原创 2023-03-13 09:43:19 · 720 阅读 · 0 评论 -
【数据结构与算法】字符串1:反转字符串I & 反转字符串II &反转字符串里的单词 & 剑指offer(替换空格、左旋转字符串)
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。示例 1:示例 2:提示:看到这道题的第一反应就是双指针法,不得不说,双指针法对这种排序问题真的YYDS,相比于我们前面在学习链表的时候所使用到的双指针法,字符串的反转其实比起链表还要简单一些。在内存中链表可以是无序的,但是字符串本质上也可以说的上是一种数组,所以元素在内存中是连续分布的。那么对于这道题我们选择使用双指针法:分原创 2023-02-22 16:35:58 · 880 阅读 · 0 评论 -
【数据结构与算法】哈希表2:四数相加II & 赎金信 & 三数之和 & 四数之和
分析题意,题目中是四个独立数组,要求我们只要找到nums1[i] + nums2[j] + nums3[k] + nums4[l] = 0,同时这四个数组长度相同,并且在本题目中并没有限制数组元素出现的次数,也就是说只要满足四数组元素相加为0都可以作为一组解。使用哈希解法的话,前面的学习我们也已经知道,数组也是一种简单的哈希表,通过定义一个record[26]的数组(因为条件说明仅为小写字母),首先遍历所有magazine中的元素对应record数组中的索引,出现相同的key值就将该value加一。原创 2023-02-21 22:39:55 · 697 阅读 · 0 评论 -
【数据结构与算法】哈希表1:字母异位词 & 两数交集 & 快乐数 & 两数之和
当我们遇到这样一个场景:快速判断一个元素是否出现在集合里,就需要考虑哈希法。牺牲空间去换取时间。原创 2023-02-20 21:32:41 · 815 阅读 · 0 评论 -
【数据结构与算法】链表2:节点交换与删除 & 链表相交 & 环形链表
算法任务:链表总结、leetcode24.两两交换链表中的节点、leetcode19.删除链表的倒数第N个节点、Leetcode面试题02.07.链表相交、Leetcode142.环形链表II原创 2023-02-18 18:32:07 · 1084 阅读 · 0 评论 -
【数据结构与算法】链表1:移除链表 &设计链表&链表反转(双指针法、递归法)
链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。链表的入口节点称为链表的头节点也就是head。// 单链表 strcut ListNode {int val;//节点上存储的元素 ListNode * next;//指向下一个节点的指针 ListNode(int x) : val(x) , next(NULL) {} // 节点的构造函数 };原创 2023-02-17 20:54:29 · 768 阅读 · 0 评论 -
【数据结构与算法】数组2:双指针法 & 二分法(螺旋矩阵)
在这里的话也才发现滑动窗口这个算法精妙所在,通过不断变更一个窗口的位置,将算法的复杂度明显优化,而且相比较暴力排序,滑动窗口也只用了一个for循环和一个while循环,从而将算法复杂度降为O(n),然后就是要求这个子数组长度最小,遇到这个问题,我们想到的就是首先分出若干个有效子数组(要求是连续的),然后对这些子数组的长度进行筛选,留下长度最小的返回该数组长度。那怎么理解滑动窗口呢,其实滑动窗口的做法也可以作为双指针法的一种,通过动态变换滑动窗口的起始和终止位置构成的滑动区域,依次遍历可能出现的子数组。原创 2023-02-16 22:17:13 · 518 阅读 · 0 评论 -
【数据结构与算法】数组1:二分查找 & 移除元素
数组理论基础704.二分查找27.移除元素(1)数组是存放在连续内存空间上的相同类型数据的集合。注意:(2)正因为数组在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。例如删除下标为3的元素,我们需要堆下标为3的元素后面的所有元素都要做移动操作,如图所示:(3)数组的元素是不能删除的,只能使用覆盖的方式。(4)C++中二维数组在地址空间上是连续的。通过编写一个程序来验证:在C++中,一个int(整型)变量占据4个字节,所以相邻两个数组元素的地址差4个字节给定一个 n原创 2023-02-15 16:02:16 · 686 阅读 · 0 评论