随笔分类 -  专业

摘要:基于比较的排序,不需要数据具有特征,只需要告诉比较的规则,那么便可以排序,非常的通用。 不基于比较的排序,需要数据具有特征,有局限性,不是通用的。 基数排序是一种不基于比较的排序, 一般排序的是十进制的非负整数。 代码实现 //基数排序 #define _CRT_SECURE_NO_WARNINGS 阅读全文
posted @ 2023-12-20 18:43 lwj1239 阅读(19) 评论(0) 推荐(0)
摘要:堆 堆是一种特殊的完全二叉树,其他语言中的优先级队列就是堆。堆分为大根堆和小根堆,大根堆即对于每一颗树,它的父亲节点的值,一定大于它的孩子节点的值,左右节点的值不用管它的顺序。小根堆同理。 堆的实现通常是用数组实现的,那么对于每一个节点在数组中怎么找到它的父节点和它的左右孩子就成了一个问题。 那么对 阅读全文
posted @ 2023-12-17 09:41 lwj1239 阅读(32) 评论(0) 推荐(0)
摘要:在一个无序数组中求第k大或者第k小的问题,要求时间复杂度是O(N),那么对于这两个问题只要解决一个另一个就解决了。因为求第一大可以转换成求第n小。 那么对于一个有100个元素的数组来说,我们要求第57小的数,那么它就是在求这个数组排好序之后下标在56的值,因为如果数组的元素没有重复的话,那么在下标0 阅读全文
posted @ 2023-12-16 23:47 lwj1239 阅读(113) 评论(0) 推荐(0)
摘要:快速排序是一个经典的算法,它是基于比较排序中最快的算法之一,时间复杂度是O(N * logN)的,时间复杂度证明可以用master公式证明。但经典的快速排序会存在最坏的情况,会使得快速排序的时间复杂度退化到O(N2),这样快速排序也就失去了意义。因此我们为了避免出现最坏的情况,来引入随机一行为,每次 阅读全文
posted @ 2023-12-15 19:40 lwj1239 阅读(93) 评论(0) 推荐(0)
摘要:归并排序是计算机之父"冯·诺依曼"发明的,但这其中隐藏了一种归并分治的思想。这种思想在一些题目中会帮助我们解决很多问题。 原理 对于一个大问题的答案,如果等于左边子问题的答案 + 右边子问题的答案 + 跨越左右问题的答案。 在计算跨越左右问题的答案时,左右两边是有序的是否会对我们计算答案产生便利。 阅读全文
posted @ 2023-12-14 21:39 lwj1239 阅读(13) 评论(0) 推荐(0)
摘要:递归的本质是系统帮我们进行了压栈,栈的名字叫做系统栈。但系统栈的空间十分有限,因此在工程上我们需要把递归改写成用内存中的栈来模拟系统压栈,以此来实现非递归。 master公式又叫主定理,是一种估算递归时间复杂度的公式。但有个前提条件:只有是子问题规模相同的递归才能使用。 T(N) = a * T(N 阅读全文
posted @ 2023-12-14 09:15 lwj1239 阅读(64) 评论(0) 推荐(0)
摘要:队列 队列也是一种受限制的线性表,只能在一端进行插入,在另一端进行删除。 当然也有一种特殊的队列,名叫双端队列,也就是一段既可以插入也可以删除,在另一端也可以插入和删除。这就是双端队列。 队列的顺序实现(非环形数组) 代码实现 //队列的顺序实现(非环形数组) #define _CRT_SECURE 阅读全文
posted @ 2023-12-08 20:02 lwj1239 阅读(9) 评论(0) 推荐(0)
摘要:栈 栈是一个具有一定操作约束的线性表,只能在一端(栈顶,top)做插入和删除。 栈的顺序实现 //栈的顺序实现 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #in 阅读全文
posted @ 2023-12-08 19:15 lwj1239 阅读(24) 评论(0) 推荐(0)
摘要:前言 在学习专业知识的过程中,我们经常看到两个词一起出现,数据结构和算法,为什么呢?因为通常选择正确的数据结构往往能够让我们程序算法 的效率变得更好。 解决问题方法的效率,跟数据的组织方式是相关联的。例如在线性表中删除一个数,选择顺序表(数组),时间复杂度是O(N),而用链表删除一个数是比顺序表的效 阅读全文
posted @ 2023-12-04 00:26 lwj1239 阅读(35) 评论(0) 推荐(0)
摘要:二分查找 二分查找,一般是在一个有序的数组上的,但不一定要在一个有序的数组上(比如寻找峰值问题),总之只要可以确定答案在某一个区间,就可以使用二分查找。 寻找峰值 力扣题目链接 解题思路 如果数组的大小是1,根据题目的要求,它一定就是峰值,直接返回 判断下标0和下标n - 1是不是峰值,如果是直接返 阅读全文
posted @ 2023-11-28 16:17 lwj1239 阅读(22) 评论(0) 推荐(0)
摘要:堆 堆是一种完全二叉树,也是一种优先级队列堆分为大根堆和小根堆,大根堆即对于每一颗树,它的父亲节点的值,一定大于它的孩子节点的值,左右节点的值不用管它的顺序。小根堆同理。 写了一道可以用堆这种数据结构求解的题目,即找数组中第k大的数,要求时间复杂度为O(N)。 力扣题目链接 解题思路 根据堆的定义我 阅读全文
posted @ 2023-11-26 23:18 lwj1239 阅读(24) 评论(0) 推荐(0)
摘要:KMP算法 字符串查找算法中的经典算法,时间复杂度O(N + M),N是主串的长度,M是字串的长度。 int* get_next(char s[], int len) { int* next = (int*)malloc(sizeof(int) * len);//netx数组的长度跟s2的长度一样 阅读全文
posted @ 2023-11-19 21:59 lwj1239 阅读(37) 评论(0) 推荐(0)
摘要:1. 问题H:【C语言训练】排序问题<1> 1.1. 解题思路 题目已经告诉你了,用排序 1.2. 解题方法 1.2.1. 冒泡排序 #include <stdio.h> #define N 10 void bubberSort(int *a, int size);//冒泡排序,升序,即按从小到大的 阅读全文
posted @ 2023-11-12 20:43 lwj1239 阅读(61) 评论(0) 推荐(0)
摘要:今天刷题的时候碰到了一个问题,这个问题有点难,想了半天还是没有想出来,最后去查的题解,发现解决这道题需要用到一个数学上的原理 容斥原理。 如果用正常的思维去写这个题目就会超时,因此我们就使用容斥原理来求解。 设集合A的是2的倍数,集合B是3的倍数,集合C是5的倍数。 那么我们要的答案就是集合A和集合 阅读全文
posted @ 2023-11-08 01:29 lwj1239 阅读(16) 评论(0) 推荐(0)
摘要:1. 浮点数的精度问题 在计算机中,浮点数不能像整数一样精确的表示出来,存放的是它的近似值。 例如,存放0.3在计算机中可能是0.2999999999,或者是0.3300000001。 这种情况会对比较操作进行干扰,==这个运算符就不对了(在c/c++中"=="要完全相同才是true),所以我们需要 阅读全文
posted @ 2023-11-07 00:26 lwj1239 阅读(12) 评论(0) 推荐(0)
摘要:1. 问题A:LY学长的随机数 解题思路 第一种思路是先去重后排序 第二种思路是先排序再去重 解题方法 暴力遍历 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #i 阅读全文
posted @ 2023-11-05 19:13 lwj1239 阅读(72) 评论(0) 推荐(0)
摘要:1. 动态规划 在我看来动态规划就是用一种缓存机制来保存之前求解的答案,如果要再次用到已经求解过的答案就直接把缓存里面的答案给他而不必再次求解,也就是用空间换取时间 那么要解决动态规划问题,最好按照以下步骤来求解 用暴力递归来求解问题 能用记忆化搜索就先用记忆化搜索来优化递归,时间复杂度是O(N) 阅读全文
posted @ 2023-11-05 19:02 lwj1239 阅读(46) 评论(0) 推荐(0)
摘要:排序 归并排序 本质是将多个序列进行合并,和快排一样也用的是分而治之的思想,并且它也是基于比较里面较快的算法且能保持稳定性的算法。 那么怎么将两个序列合并呢?(假设左右两边已经有序) 开辟一个和数组一样大的辅助数组,再设定两个指针,第一个指针指向第一个序列的开头,第二个指针指向第二个序列的开头。 升 阅读全文
posted @ 2023-11-01 23:14 lwj1239 阅读(31) 评论(0) 推荐(0)
摘要:问题 A: ly喜欢玩石头 解题思路 题目告诉我们(1<=a,b <=1e9),那么int类型就够了。因为这两个数相加最大为20亿 定义两个变量a和b 输入a和b的值 打印a加b的值 #include <stdio.h> #include <string.h> #include <stdlib.h> 阅读全文
posted @ 2023-10-29 21:05 lwj1239 阅读(102) 评论(0) 推荐(0)
摘要:一、单链表 1.判断两个链表有没有相交,如果有相交,返回第一个相交节点,没有返回NULL; 根据观察图片我们发现,如果两个链表有相交部分,那么最后一个节点地址必定相等,如果没有相交最后一个节点地址不相等。 当两个相交链表的长度相等时,两个指针分别往后面走,当它们相遇时,相遇的节点就第一个相交节点。 阅读全文
posted @ 2023-10-25 23:56 lwj1239 阅读(57) 评论(0) 推荐(0)