![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
彭同学她同桌
这个作者很懒,什么都没留下…
展开
-
算法-前缀和
前缀和如果有的那种滑动窗口 双指针解决不了 例如数组中有0和负数 就导致你移动右边指针sum并不是一定是增大 就可用非普通前缀和非普通前缀和就不是用sp数组解决 而是用unordered_map解决这种时候就不用在乎是那些数字 只需要知道数量 用键表示前缀和的sum 而值表示有几个这样的前缀和...原创 2022-05-26 17:24:46 · 59 阅读 · 0 评论 -
算法-滑动窗口
也可以理解为双指针滑动窗口分为两种 可变窗口和固定窗口固定窗口l = 0 r = n 然后向中间移动r-l+1就是窗口大小可变窗口l = 0 r = 1向右边移动原创 2022-05-25 18:11:57 · 169 阅读 · 0 评论 -
算法-二叉树
二叉树层序遍历class Solution {public: queue<TreeNode*> ready;//队列中放入准备要记录的节点 vector<vector<int>> res;//存储最终输出的结果 vector<vector<int>> levelOrder(TreeNode* root) { if(!root)//如果这个树是空的就直接结束 { re原创 2022-05-11 14:33:11 · 288 阅读 · 2 评论 -
算法-状态压缩
什么是状态压缩就是用二进制来表示一些状态 比如7(10) -> 111(2)可以表示三个物品的八个状态 000 001 010 011 100 101 110 111当要表示的状态数并不是2的次方时怎么办例如10 很明显 正常来说应该用log210 然后对10向上取整 就是4 那难道我们要用 1111(2)来表示10个状态吗 肯定不对 因为1111会表示16个状态做法让10 依次减 0 1 2 4 8 当出现负数的时候 直接取那个数字 310-0 10-1 9-2 7-4 3原创 2022-04-11 18:17:13 · 278 阅读 · 0 评论 -
算法-01背包
01背包我们通过分治把这个问题分解为 当背包容量为0,1,2,3,4。。。时背包容量的最优解例如w v w为重量 v为价值1 22 43 44 5我们可以知道当考虑到dp[2][1]时 当前容量为2 考虑第1个物品 第二个物品为1 2 那么重量1<2 可以被放入 然后再考虑2-1=1 说明此时还可以再放入一个重量为1的物品 那么我们就去dp[1][]找 我们知道我们的思路是分治 所以每一行当考虑完所有物品时就是当前最优解 所以我们会选择dp[N][V]作为答案输出 那么当我们在考虑原创 2022-04-02 17:39:08 · 308 阅读 · 0 评论 -
算法-最小生成树
最小生成树一般是由无向图生成最小生成树 无向图中每条边都有权值而最小生成树的最小 就是每条边权值相加最小Kruskal算法核心算法是 将每条边都拿出来 再对权值进行从小到大排序 再将边还原回去 如果在还原一条边的时候出现了环 则丢弃这条边 每次成功新增一条边就让边数+1 直到边总数为n-1Prim算法基本和那个最短路径算法一样...原创 2021-09-08 14:17:30 · 56 阅读 · 0 评论 -
算法-KMP
kmp算法在我的理解里是对于字符串识别时暴力破解的一个升级版 a:adfffffasgg b:fas他减少了没有必要的回溯,使计算的时候更接近人的思维,更简单,时间更短首先kmp算法分为模式串 目标串 next数组模式串:想要找的那个字符串 就是b串目标串:所有字符所在的字符串 就是a串next数组:是分析模式串 针对重复的字符串部分进行标记 从而使模式串在和目标串失配的时候知道重新回溯的位置(防止没必要的失配)next的组成主要就是记录模式串前缀和后缀有几个相同的字符串 比如原创 2021-08-31 10:43:14 · 86 阅读 · 0 评论 -
算法-拓扑排序
作用大概率感觉是用来检测换一个有向图中有没有环 但是他没办法判断哪些结点在环里 哪些不在 例如将偏序转换成全序 就是在一个有向无环图中 得到这个图中 我们如果要排离散数学 就必须先排高等数学 那么如果这个图一复杂 比如我们要知道排c6 就要看图 一个个找 c4 c2 c1这三个要先排 如果我们对这个图进行拓扑排序 那么结果是c1 c3 c2 c4 c5 c6 c7那么通过这个知道如果c1在c2之前 要么c1和c2并列 要么c1在c2之前 所以 我们只需要按拓扑排序结果进行排课表就没问题什么是偏原创 2021-08-05 11:07:51 · 159 阅读 · 0 评论 -
算法-最短路径算法
最短路径算法 Dijkstra(速度最慢 成功率最高)未确定结点未确定从起点到当前点的最短路长度的节点已确定结点已确定从起点到当前点的最短路长度的节点更新(松弛)将起点O到结点A的最短路径长度 + 结点A到结点B的边长 与 起点O直接到结点B的最短路径比较 选择最小值每次从未确定的结点中取一个与起点O距离最短的点 将他归类为已确定结点 并且用他更新从起点到其他所有未确定点的距离 直到所有点都被归类为已确定点基本思想用vis记录已经确定的点 用dis记录每个结点到起点的距离最开原创 2021-08-02 16:45:38 · 251 阅读 · 0 评论 -
算法-快速排序
快速排序核心思想是我们取出一个数将大于他的数放他右边 小于他的数就放他左边然后他的位置就固定下来了 因为左边的数一定只会在他左边移动 右边的数也不会到左边去所以每一次递归都能排好一个数字 时间复杂度是nlogn那我们先实现第一部分 取出一个数 然后小的放左边 大的放右边/*快排 根据快排思想纯自己写出来的*/void qsort(vector<int>&arr, int L, int R){ /*因为前面没想好 所以后面会改变L和R 最后又要用 所以这里拷贝一下 好蠢又好原创 2021-07-23 15:25:23 · 64 阅读 · 0 评论 -
算法-归并排序
最关键的部分把一个数组前后端已经是有序的序列 例如我们要将他分为两个数组: 首先我们知道这个arr数组我们只是截了一部分 他的最左端是L位 最右端是R然后找到了有序的部分为M位 我们要将他放到两个数组中代码实现vector<int> left;vector<right> right;/*将左边部分放进去*/for(int i = L;i<M;i++){ left.push_back(arr[i]);}for(int i = M;i<=R;i++原创 2021-07-22 21:45:21 · 69 阅读 · 1 评论 -
算法-堆排序
堆排序堆排序要作什么用数列构建一个大顶堆 取出堆顶的数字调整剩下的数字 构建出新的大顶堆 再次取出堆顶的数字什么是大顶堆父结点值一定大于子结点值如何构建大顶堆将整个数列的初始状态视作一棵完全二叉树,自底向上调整树的结构,使其满足大顶堆的要求完全二叉树的性质对于完全二叉树中的第 i 个数,它的左子节点下标:left = 2i + 1对于完全二叉树中的第 i 个数,它的右子节点下标:right = left + 1对于有 n 个元素的完全二叉树(n≥2)(n≥2),它的最后一个非叶子结点原创 2021-07-22 20:48:56 · 69 阅读 · 1 评论 -
算法-为什么有些排序可以突破时间复杂度n^2^的界限
逆序对逆序对就是我们从小到大排列时 在数组中的两个数字 如果左边那个数字大于右边那个数字 就是逆序 比如 1 5 2 则5和2就是逆序对对于随即数组 逆序对的数量是o2级 如果只是简单的采用交换相邻元素来消除逆序对 一次就只能消除一个 比如 1 2 6 5 3 则6和3 ,5和3,6和5 是三对逆序对 交换6 和1 2 6 5 3此时还是有5和3,6和3两组此时随便用一个临格交换 比如通过冒泡 将6交换到最右边 1 2 5 3 6其实其他的序列都是没有任何改变的 也就是还有个逆序对5和3并没有改变原创 2021-07-22 18:41:20 · 61 阅读 · 0 评论 -
算法-算法笔记
剑指 Offer 03. 数组中重复的数字做法数组中找重复数字我们第一个能想到的就是一一遍历 然后拿hash表记录下来只要有一个键的值超过了1 那就直接输出我的办法也是 可开辟一个vectorcan每个数字值就是他的位置 然后出现一次的就把值标位false 下次再遇见can[i] == false这个值的时候就直接输出更好的办法核心思想一个重要的点是题目中数一定都比总数量n小 所以如果没有重复的数字 在0-n这些坑里面应该放着0-n数字对齐 也就是0号坑里面一定是0 所以我们就在每次遍历的时候原创 2021-07-16 21:28:16 · 323 阅读 · 0 评论 -
算法-BFS
广度优先搜索的核心思想就是走过的路要有个标记就像图中 我们最开始从左上角开始走的很明显第二步能搜索的地方就是f(x+1,y)和f(x,y+1) 所以我们可以用一个队列Q记录下第一步走的是x(0,0)那么第二步就是 以x为中心进行扩散 那么把x从Q队列中弹出 装入x(1,0)和x(0,1) 此时Q队列 x(1,0) x(0,1)第三步呢 我们就从Q中获取最前面那个点x(1,0) 然后将f(x+1,y)和f(x,y+1)压入队Q内 就是x(2,0) x(1,1) 此时Q队列 x(0,1) x原创 2021-07-12 15:38:51 · 53 阅读 · 0 评论 -
算法-检查1的个数
请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。示例 1:输入:00000000000000000000000000001011输出:3解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。示例 2:输入:00000000000000000000000010000000输出:1解释:输入的二进制串 0000原创 2021-06-23 11:01:50 · 252 阅读 · 0 评论 -
算法-递归
找整个递归的终止条件:递归应该在什么时候结束?找返回值:应该给上一级返回什么信息?本级递归应该做什么:在这一级递归中,应该完成什么任务?原创 2021-06-09 10:44:32 · 76 阅读 · 0 评论