数据结构
文章平均质量分 89
呦柚子
这个作者很懒,什么都没留下…
展开
-
[数据结构与算法] 二分查找II —变形问题
几种二分查找的变形问题。????????“十个二分九个错”。注意:终止条件、区间上下界更新方法、返回值选择。???????? 下述变形问题的前提是数据均以从小到大排序。变形一:查找第一个值等于给定值的元素???? 二分查找最简单的一种即有序数据集合中不存在重复的数据,在其中查找值等于某个给定值的数据。 将这个问题修改为:有序数据集合中存在重复的数据,找到第一个值等于给定值的数据,如下有序数组,其中,a[5],a[6],a[7]的值都等于 8,是重复的数据,要查找第一个等于 8 的数据,也就是下标原创 2021-11-03 17:44:48 · 365 阅读 · 0 评论 -
[数据结构与算法] 二分查找 I
一种针对有序数据集合的查找方法:二分查找(Binary Search),折半查找。二分思想二分查找是一种非常简单易懂的快速查找算法。猜测0-99中的目标数字,target = 23 。如果是 0 到 999 的数字,最多也只要 10 次就能猜中。对有序表折半查找,其最坏情况下查找一个元素的最大比较次数将介于1和 [ log2n ] + 1 ( n为元素的个数)之间。假设有 10 个订单,订单金额分别是:8,11,19,23,27,33,45,55,67,98。利用二分思想,每次都与区间的中间原创 2021-11-03 17:32:40 · 496 阅读 · 0 评论 -
[数据结构与算法] Recursion — 递归
Recursion — 递归递归是一种应用非常广泛的算法(或者编程技巧)。很多数据结构和算法的编码实现都要用到递归,比如 DFS 深度优先搜索、前中后序二叉树遍历等等。基本上,所有的递归问题都可以用递推公式来表示。递归需要满足的三个条件一个问题的解可以分解为几个子问题(子问题就是数据规模更小的问题)的解这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样存在递归终止条件如何编写递归代码?写递归代码最关键的是写出递推公式,找到终止条件,剩下的就是将递推公式转化为代码。上台阶、原创 2021-11-03 16:59:22 · 258 阅读 · 0 评论 -
[数据结构与算法] 链表 II
[数据结构与算法] 链表 II一、理解指针或引用的含义二、警惕指针丢失和内存泄漏(单链表)三、利用“哨兵”简化实现难度引入”哨兵“????♂️举例对比有无哨兵的情况四、重点留意边界条件处理五、举例画图,辅助思考六、多写多练一、理解指针或引用的含义有些语言有“指针”的概念,比如 C 语言;有些语言没有指针,取而代之的是“引用”,比如 Java、Python。不管是“指针”还是“引用”,都是存储所指对象的内存地址。将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针,或者反过来说,指针中存储了这个原创 2021-11-03 16:37:04 · 191 阅读 · 0 评论 -
[数据结构与算法] 链表 I
链表结构底层的存储结构 如上图,数组需要一块连续的内存空间来存储,对内存的要求比较高。如果申请一个 100MB 大小的数组,当内存中没有连续的、足够大的存储空间时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败。而链表并不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用,如果申请的是 100MB 大小的链表,根本不会有问题。三种最常见的链表结构,分别是:单链表、双向链表和循环链表。????单链表????链表通过指针将一组零散的内存块...原创 2021-11-03 14:42:23 · 156 阅读 · 0 评论 -
[数据结构与算法] 队列
CPU 资源是有限的,任务的处理速度与线程个数并不是线性正相关。相反,过多的线程反而会导致 CPU 频繁切换,处理性能下降。所以,线程池的大小一般都是综合考虑要处理任务的特点和硬件环境,来事先设置的。当向固定大小的线程池中请求一个线程时,如果线程池中没有空闲资源了,这个时候线程池如何处理这个请求?是拒绝请求还是排队请求?各种处理策略又是怎么实现的呢?这些问题并不复杂,其底层的数据结构就是队列(queue)。如何理解“队列”?队列:先进先出。栈只支持...原创 2021-11-02 21:48:18 · 123 阅读 · 0 评论 -
[数据结构与算法] 栈
关于“栈”,一个非常贴切的例子,就是一摞叠在一起的盘子。平时放盘子的时候,都是从下往上一个一个放;取的时候,也是从上往下一个一个地依次取,不能从中间任意抽出。后进者先出,先进者后出,这就是典型的“栈”结构。从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。特定的数据结构是对特定场景的抽象,数组或链表暴露了太多的操作接口,操作上灵活自由,但使用时就比较不可控,自然也就更容易出错。当某个数据集合只涉及在一端插入和删除数据,...原创 2021-09-26 15:33:57 · 965 阅读 · 0 评论 -
[数据结构与算法] 复杂度分析
数据结构和算法解决的是“快”和“省”的问题,所以执行效率是算法一个非常重要的考量指标。什么是复杂度分析?数据结构和算法解决是“如何让代码运行得更快,如何让代码更省存储空间”,需从执行时间和占用空间两个维度来评估数据结构和算法的性能。 分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度。 复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。为什么要进行复杂度分析?事后统计法有非常大的局限性。测试结果非常依赖测试环境。测试环境...原创 2021-09-26 15:08:42 · 263 阅读 · 0 评论 -
[数据结构与算法] 大框
10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。...原创 2021-09-26 15:03:00 · 63 阅读 · 0 评论 -
leetcode — 234. 回文链表
给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。示例 1:输入:head = [1,2,2,1]输出:true示例 2:输入:head = [1,2]输出:false提示:链表中节点数目在范围[1, 105]内 0 <= Node.val <= 9进阶:你能否用O(n)时间复杂度和O(1)空间复杂度解决此题?方法一:将值复制到数组中后用双指针法复制链表值到数组...原创 2021-09-07 17:38:34 · 247 阅读 · 0 评论 -
[数据结构与算法] 堆栈与队列
1. Python:一般的数组即可。只是采用stack的调用方式。stack = [1,2,3]stack.append(15) #向stack中添加元素stack.pop() #取出并删除stack最近添加的元素#注意:没有peek方法stack[-1] #取出stack最近添加的元素,类似于peek方法stack #非空,就是非02. Java:Stack&l...原创 2021-07-15 18:00:45 · 723 阅读 · 0 评论 -
[数据结构与算法] 数组与链表(2)
4、两两交换链表中的节点给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数pos来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果pos是-1,则在该链表中没有环。注意:pos不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回true。 否则,返回false。进阶:你能用O(1)(即,常量)内存解决此问题吗?示例 1:...原创 2021-07-14 21:24:39 · 188 阅读 · 0 评论 -
[数据结构与算法] 数组与链表(1)
[小点整合]1、题目分析(1)明确题意,包括输入输出、数据范围、考察具体的知识点; (2)列出所有的解决方法; (3)评估每种方法的时间、空间复杂度; (4)实现最优的解决方案,注意代码准确度并进行相关的测试; (5)进行复盘与整理,补充不足。2、数组:内存中连续一段的存储区域,下标从0开始,插入与删除的平均时间复杂度为O(n),查询可以在O(1)时间完成,根据元素的下标进行访问; 链表:存...原创 2021-07-12 22:38:50 · 125 阅读 · 0 评论