算法
文章平均质量分 85
p0inter
生而自由,爱而无畏,保持热爱奔赴山海
展开
-
算法---链表
要反转链表的第一个节点是head,head的前面一个节点是pre,如果head是首节点,则pre等于NULL,要反转链表的最后一个节点的后一个节点是p。比如说我们要反转的是2,5,4,3,则head节点是2,pre是7,p是6;如果反转的是9,7,2,则head是9,pre是NULL,p是3.下面函数返回值是反转链表后的首节点,head是要反转链表的首节点,p是要反转链表的最后一个节点的后一个节点。在这里,我们约定数据元素类型是。反转全部元素,反转全部元素最后一个节点的下一个节点是NULL。......原创 2022-07-20 15:45:34 · 1049 阅读 · 1 评论 -
搜索---广度优先遍历、深度优先遍历、回溯法
广度优先搜索(BFS)广度优先搜索是按层来处理顶点的,距离开始点最近的那些顶点首先被访问,而最远的那些顶点则最后被访问。BFS的代码使用了一个队列。搜索的步骤:首先选择一个顶点作为起始顶点,将起始顶点放入队列中从队列首部选出一个顶点,将与之相邻并且没有被访问的结点依次加入到队列的队尾,然后访问这些与之相邻并且没有被访问过的结点,将队列队首的结点删去。按照步骤2处理队列中下一个结点,直到找到要找的结点或者队列中没有结点结束。void BFS(){ 定义队列; 定义备忘录,用于记原创 2022-04-05 21:27:11 · 2325 阅读 · 0 评论 -
排序算法---快速排序、堆排序、冒泡排序
排序算法1 快速排序1 快速排序文章原地址:https://blog.csdn.net/morewindows/article/details/6684558快速排序的平均时间复杂度是0(NlogN),它采用了一种分治的策略,通常称其为分治法。该方法的基本思想是:先从数列中取出一个数作为基准数。分区:将大于这个数放到它的右边,小于等于它的数全放在它的左边再对左右区间重复第二步,直到各区间只要一个数虽然快速排序称为分治法,但分治法这三个字显然无法很好概括快速排序的全部步骤,因此我对快速排序做了原创 2022-05-09 22:24:31 · 1058 阅读 · 0 评论 -
C语言uthash的用法
官网解释:https://troydhanson.github.io/uthash/userguide.html在使用之前,我们必须包含uthash.h的头文件,你需要将该头文件加入到你的项目中#include "uthash.h"1 定义一个哈希表我们直到,在哈希表中,最重要的就是键和值,在 utash 中,哈希表由结构体组成。 每个结构体代表一个键值关联。 一个或多个结构体里的域构成键, 该结构指针就是值。我们定义一个my_struct 结构体,用id的值作为键值,my_struct 的实例原创 2022-05-03 21:44:00 · 2840 阅读 · 1 评论 -
算法---KMP算法
字符串1 KMP算法状态机概述构建状态转移1 KMP算法原文链接:https://zhuanlan.zhihu.com/p/83334559先约定,本文用pat表示模式串,长度为M,txt表示文本串,长度为N,KMP算法是在txt中查找子串pat,如果找到,返回这个子串的起始索引,否则返回-1.用一张图演示一下KMP算法:KMP算法永不回退txt中的索引i,不走回头路。而是借助一个数组dp,dp数组中存储的信息把pat移到正确的位置继续匹配。KMP的难点在于计算dp数组,计算这个dp数组,之和转载 2022-04-26 19:50:11 · 273 阅读 · 0 评论 -
算法---栈和队列
栈和队列1 栈栈的顺序存储栈的链式存储2 队列队列的顺序存储队列的链式存储1 栈参考文章:https://zhuanlan.zhihu.com/p/346164833https://zhuanlan.zhihu.com/p/120965372#:~:text=%E6%A0%88%E6%98%AF%E4%B8%80%E7%A7%8D%20%E5%90%8E%E8%BF%9B%E5%85%88%E5%87%BA%EF%BC%88LIFO%EF%BC%89,%E7%9A%84%E6%95%B0%E6%8D原创 2022-04-21 21:49:45 · 813 阅读 · 0 评论 -
算法---递归
递归结题三部曲何为递归?程序反复调用自身即是递归。我自己在刚开始解决递归问题的时候,总是会去纠结这一层函数做了什么,它调用自身后的下一层函数又做了什么…然后就会觉得实现一个递归解法十分复杂,根本就无从下手。相信很多初学者和我一样,这是一个思维误区,一定要走出来。既然递归是一个反复调用自身的过程,这就说明它每一级的功能都是一样的,因此我们只需要关注一级递归的解决过程即可。从图中可以看出,递归是先递后归,自下往上处理。如上图所示,我们需要关心的主要是以下三点:整个递归的终止条件。一级递归需要做转载 2022-04-18 21:48:29 · 96 阅读 · 0 评论 -
算法---数
数1 最大公约数2 最小公约数3 进制转换4 阶乘统计阶乘尾部0的个数1 最大公约数欧几里得算法:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。gcd(a,b)=gcd(b,a%b); /* a>b*/具体代码实现如下:int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b);}2 最小公约数设a,b的最小公约数为lcm(a,b)。有定理:lcm(a,b)*gcd(a,b)=a*b);具体原创 2022-04-13 21:48:38 · 428 阅读 · 0 评论 -
基于Hash表的排序--C语言
我们知道,C语言里面是没有hash表的,但是我们可以用一个结构体表示,对结构体排序,我们可以用qsort排序。下面我们用一个LeedCode上面的一道题目讲解。347. 前 K 个高频元素这个题目是让我们求解前k个高频元素,求解思路如下:我们构建一个Hash表,Hash表用一个结构体表示,该结构体存放元素值和元素的个数,我们先把数组里面的值存放到Hash表里面,然后我们对该Hash表按照元素个数进行进行排序,这样就可以找到前k个高频元素了。1 定义Hash表#define Hash_SIZE 20转载 2022-03-28 21:51:13 · 823 阅读 · 1 评论 -
基本的二分查找、寻找第一个和最后一个数的二分查找
二分查找1 二分查找的框架2 寻找一个数(基本的二分搜索)3 寻找左侧边界的二分搜索4 寻找右侧边界的二分查找二分查找场景:寻找一个数、寻找左侧边界、寻找右侧边界1 二分查找的框架int binarySearch(int *nums,int numsSize,int target){ int left=0,rigth = ...; while(...) { int mid = left +(rigth-left)/2; if(nums[mid]原创 2022-03-23 22:56:07 · 1943 阅读 · 1 评论