随笔分类 -  专业 / 算法

1
摘要:62.不同路径 力扣题目链接 解题思路 一个位置只能是左边的格子或者上面的格子到达,那么路径数就是左边格子的路径数加上上面格子的路径数 代码实现 int uniquePaths(int m, int n) { int dp[101][101] = {0}; for (int i = 1; i <= 阅读全文
posted @ 2024-02-19 20:16 lwj1239 阅读(25) 评论(0) 推荐(0) 编辑
摘要:746. 使用最小花费爬楼梯 力扣题目链接 思路: 暴力递归 解题思路 把每一种可能都枚举,也就是dfs搜索每一种可能的情况,再求出其中最小的花费返回即可。 代码实现 //求两个数中的最小值 int min (int a, int b) { return a < b? a: b; } //表示从下标 阅读全文
posted @ 2024-02-15 22:23 lwj1239 阅读(10) 评论(0) 推荐(0) 编辑
摘要:矩阵乘法两个矩阵要想相乘必须一个矩阵的行等于另一个矩阵的列 矩阵乘法的性质:单位矩阵 * 矩阵 = 原矩阵 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #incl 阅读全文
posted @ 2024-02-04 22:46 lwj1239 阅读(12) 评论(0) 推荐(0) 编辑
摘要:对顶堆是由一个大顶堆和一个小顶堆组成的数据结构,用来处理动态求解一个序列中第k大或者第k小的数据结构。其中大顶堆在小顶堆的下面,为什么这样设计呢? 因为如果小顶堆的堆顶大于大顶堆的堆顶,那么对于小顶堆中的所有元素就大于大顶堆中的所有元素了。 原理很简单:根据数学中不等式的传递原理,假如一个集合A中的 阅读全文
posted @ 2024-01-30 22:01 lwj1239 阅读(73) 评论(0) 推荐(0) 编辑
摘要:A*算法可视化视频和算法解释链接 A*算法是求解一个点到另一个点的最短路径,是针对点到点的最短路径算法。 A*算法是对bfs的改进,当求解一个源点到目标点的最短距离时,bfs会进行许多不必要的搜索,大大浪费了空间和效率,因此诞生了A*算法。 A*算法是一个启发式的搜索算法,它其实和迪杰斯特拉算法关系 阅读全文
posted @ 2024-01-26 16:39 lwj1239 阅读(54) 评论(0) 推荐(0) 编辑
摘要:单源最短路径是求解给定一个起点到其他所有的点的最短距离。 适用的范围:有向图、边的权值没有负数 洛谷测试链接 代码实现 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> 阅读全文
posted @ 2024-01-25 19:55 lwj1239 阅读(14) 评论(0) 推荐(0) 编辑
摘要:生成树是指无向图中连通且n个顶点n - 1条边的树。最小生成树就是构造连通图的最小代价的生成树。 最小瓶颈树就是在树上最大的边权值在所有生成树中最小。那么有一个定理,最小生成树就是最小瓶颈树,但最小瓶颈树不一定是最小生成树。 解决最小生成树有两种算法分别为:Prim(不常用)和Kruskal(常用) 阅读全文
posted @ 2024-01-24 10:04 lwj1239 阅读(25) 评论(0) 推荐(0) 编辑
摘要:同余原理的背景 在写一些题目的时候有些问题说答案可能很大要求对最终的答案取模,这样可以保证答案在一个有效的范围内。 加法同余原理 (a + b) % m的值等于 ((a % m) + (b % m)) % m这个就是加法的同余原理。 乘法同余原理 (a * b) % m的值等于 ((a % m) * 阅读全文
posted @ 2024-01-07 20:33 lwj1239 阅读(65) 评论(0) 推荐(0) 编辑
摘要:解题思路 用三个变量来描述皇后摆放的位置 对于列来说,用一个变量的32位来表示皇后放放在了那些列 对于右上到左下对角线,也用一个变量的位信息表示 对于左上到右下对角线,也用一个变量的位信息表示 列皇后所在的位置就是直接把放皇后的位设置成1 右上到左下对角线就是上一个限制,加上当前决定放皇后的位置,右 阅读全文
posted @ 2024-01-07 19:57 lwj1239 阅读(38) 评论(0) 推荐(0) 编辑
摘要:相交链表 力扣题目链接 解题思路 如果两个单链表有相交,那么它们的最后一个节点的地址必定相等,如果两个单链表不相交,那么它们的最后一个节点的地址不相等。 那么想要求出第一个相交节点,只要两个链表的长度相等,然后在同时往后走,那么它们必定会在第一个相交节点相遇。 图片解析 通过这一张图片我们可以看到单 阅读全文
posted @ 2023-12-31 23:22 lwj1239 阅读(10) 评论(0) 推荐(0) 编辑
摘要:数组中只有一个数出现次数少于m次,其他数都出现了m次,求出现次数少于m次的数 解题思路 把所有数当作一个巨大的二进制,那么出现m次的数必定在它们在的位置出现了m的倍数次,而少于m次的必定没有在一些位置出现m次,所有只要不是m的倍数次的数,那么它一定属于少于出现m次的数之中。 int f(int a[ 阅读全文
posted @ 2023-12-21 23:02 lwj1239 阅读(14) 评论(0) 推荐(0) 编辑
摘要:不用比较和判断得到两个数中的最大值 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <time.h> #incl 阅读全文
posted @ 2023-12-20 20:42 lwj1239 阅读(15) 评论(0) 推荐(0) 编辑
摘要:稳定性 指拍完序之后之前在数组中的相对次序是否改变了。 基于桶思想的排序都是有稳定性的,如果数据小于64可以直接用插入排序,timsort用的就是这种。 阅读全文
posted @ 2023-12-20 19:06 lwj1239 阅读(2) 评论(0) 推荐(0) 编辑
摘要:基于比较的排序,不需要数据具有特征,只需要告诉比较的规则,那么便可以排序,非常的通用。 不基于比较的排序,需要数据具有特征,有局限性,不是通用的。 基数排序是一种不基于比较的排序, 一般排序的是十进制的非负整数。 代码实现 //基数排序 #define _CRT_SECURE_NO_WARNINGS 阅读全文
posted @ 2023-12-20 18:43 lwj1239 阅读(7) 评论(0) 推荐(0) 编辑
摘要:在一个无序数组中求第k大或者第k小的问题,要求时间复杂度是O(N),那么对于这两个问题只要解决一个另一个就解决了。因为求第一大可以转换成求第n小。 那么对于一个有100个元素的数组来说,我们要求第57小的数,那么它就是在求这个数组排好序之后下标在56的值,因为如果数组的元素没有重复的话,那么在下标0 阅读全文
posted @ 2023-12-16 23:47 lwj1239 阅读(99) 评论(0) 推荐(0) 编辑
摘要:快速排序是一个经典的算法,它是基于比较排序中最快的算法之一,时间复杂度是O(N * logN)的,时间复杂度证明可以用master公式证明。但经典的快速排序会存在最坏的情况,会使得快速排序的时间复杂度退化到O(N2),这样快速排序也就失去了意义。因此我们为了避免出现最坏的情况,来引入随机一行为,每次 阅读全文
posted @ 2023-12-15 19:40 lwj1239 阅读(68) 评论(0) 推荐(0) 编辑
摘要:归并排序是计算机之父"冯·诺依曼"发明的,但这其中隐藏了一种归并分治的思想。这种思想在一些题目中会帮助我们解决很多问题。 原理 对于一个大问题的答案,如果等于左边子问题的答案 + 右边子问题的答案 + 跨越左右问题的答案。 在计算跨越左右问题的答案时,左右两边是有序的是否会对我们计算答案产生便利。 阅读全文
posted @ 2023-12-14 21:39 lwj1239 阅读(6) 评论(0) 推荐(0) 编辑
摘要:递归的本质是系统帮我们进行了压栈,栈的名字叫做系统栈。但系统栈的空间十分有限,因此在工程上我们需要把递归改写成用内存中的栈来模拟系统压栈,以此来实现非递归。 master公式又叫主定理,是一种估算递归时间复杂度的公式。但有个前提条件:只有是子问题规模相同的递归才能使用。 T(N) = a * T(N 阅读全文
posted @ 2023-12-14 09:15 lwj1239 阅读(36) 评论(0) 推荐(0) 编辑
摘要:二分查找 二分查找,一般是在一个有序的数组上的,但不一定要在一个有序的数组上(比如寻找峰值问题),总之只要可以确定答案在某一个区间,就可以使用二分查找。 寻找峰值 力扣题目链接 解题思路 如果数组的大小是1,根据题目的要求,它一定就是峰值,直接返回 判断下标0和下标n - 1是不是峰值,如果是直接返 阅读全文
posted @ 2023-11-28 16:17 lwj1239 阅读(8) 评论(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 阅读(25) 评论(0) 推荐(0) 编辑

1