12 2023 档案
摘要:相交链表 力扣题目链接 解题思路 如果两个单链表有相交,那么它们的最后一个节点的地址必定相等,如果两个单链表不相交,那么它们的最后一个节点的地址不相等。 那么想要求出第一个相交节点,只要两个链表的长度相等,然后在同时往后走,那么它们必定会在第一个相交节点相遇。 图片解析 通过这一张图片我们可以看到单
阅读全文
摘要:数组中只有一个数出现次数少于m次,其他数都出现了m次,求出现次数少于m次的数 解题思路 把所有数当作一个巨大的二进制,那么出现m次的数必定在它们在的位置出现了m的倍数次,而少于m次的必定没有在一些位置出现m次,所有只要不是m的倍数次的数,那么它一定属于少于出现m次的数之中。 int f(int a[
阅读全文
摘要:不用比较和判断得到两个数中的最大值 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <time.h> #incl
阅读全文
摘要:稳定性 指拍完序之后之前在数组中的相对次序是否改变了。 基于桶思想的排序都是有稳定性的,如果数据小于64可以直接用插入排序,timsort用的就是这种。
阅读全文
摘要:基于比较的排序,不需要数据具有特征,只需要告诉比较的规则,那么便可以排序,非常的通用。 不基于比较的排序,需要数据具有特征,有局限性,不是通用的。 基数排序是一种不基于比较的排序, 一般排序的是十进制的非负整数。 代码实现 //基数排序 #define _CRT_SECURE_NO_WARNINGS
阅读全文
摘要:堆 堆是一种特殊的完全二叉树,其他语言中的优先级队列就是堆。堆分为大根堆和小根堆,大根堆即对于每一颗树,它的父亲节点的值,一定大于它的孩子节点的值,左右节点的值不用管它的顺序。小根堆同理。 堆的实现通常是用数组实现的,那么对于每一个节点在数组中怎么找到它的父节点和它的左右孩子就成了一个问题。 那么对
阅读全文
摘要:在一个无序数组中求第k大或者第k小的问题,要求时间复杂度是O(N),那么对于这两个问题只要解决一个另一个就解决了。因为求第一大可以转换成求第n小。 那么对于一个有100个元素的数组来说,我们要求第57小的数,那么它就是在求这个数组排好序之后下标在56的值,因为如果数组的元素没有重复的话,那么在下标0
阅读全文
摘要:快速排序是一个经典的算法,它是基于比较排序中最快的算法之一,时间复杂度是O(N * logN)的,时间复杂度证明可以用master公式证明。但经典的快速排序会存在最坏的情况,会使得快速排序的时间复杂度退化到O(N2),这样快速排序也就失去了意义。因此我们为了避免出现最坏的情况,来引入随机一行为,每次
阅读全文
摘要:归并排序是计算机之父"冯·诺依曼"发明的,但这其中隐藏了一种归并分治的思想。这种思想在一些题目中会帮助我们解决很多问题。 原理 对于一个大问题的答案,如果等于左边子问题的答案 + 右边子问题的答案 + 跨越左右问题的答案。 在计算跨越左右问题的答案时,左右两边是有序的是否会对我们计算答案产生便利。
阅读全文
摘要:递归的本质是系统帮我们进行了压栈,栈的名字叫做系统栈。但系统栈的空间十分有限,因此在工程上我们需要把递归改写成用内存中的栈来模拟系统压栈,以此来实现非递归。 master公式又叫主定理,是一种估算递归时间复杂度的公式。但有个前提条件:只有是子问题规模相同的递归才能使用。 T(N) = a * T(N
阅读全文
摘要:队列 队列也是一种受限制的线性表,只能在一端进行插入,在另一端进行删除。 当然也有一种特殊的队列,名叫双端队列,也就是一段既可以插入也可以删除,在另一端也可以插入和删除。这就是双端队列。 队列的顺序实现(非环形数组) 代码实现 //队列的顺序实现(非环形数组) #define _CRT_SECURE
阅读全文
摘要:栈 栈是一个具有一定操作约束的线性表,只能在一端(栈顶,top)做插入和删除。 栈的顺序实现 //栈的顺序实现 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #in
阅读全文
摘要:前言 在学习专业知识的过程中,我们经常看到两个词一起出现,数据结构和算法,为什么呢?因为通常选择正确的数据结构往往能够让我们程序算法 的效率变得更好。 解决问题方法的效率,跟数据的组织方式是相关联的。例如在线性表中删除一个数,选择顺序表(数组),时间复杂度是O(N),而用链表删除一个数是比顺序表的效
阅读全文