
算法
文章平均质量分 61
黑猫爱小鹿
这个作者很懒,什么都没留下…
展开
-
Leetcode768. 最多能完成排序的块 II
单调栈原创 2022-08-13 17:01:09 · 163 阅读 · 0 评论 -
水塘抽样(解决k个数据均匀抽样问题)
水塘抽样文章目录水塘抽样背景思路k=1k>1例题[398. 随机数索引](https://leetcode-cn.com/problems/random-pick-index/)背景给定一个数据流,但是数据流的长度N很大,且N直到处理完所有数据之前都不可知,如何在只遍历一遍数据(O(N))的情况下,能够随机选取出这组数据的k个概率相等的均匀抽样。(包含未知大小数据流中随机选取k个数据,使得每个数据抽取到的概率相等)(1)仅扫描数据一次。(2)空间复杂度为O(K)。空间复杂度与整个数据量无关,原创 2022-04-25 18:54:28 · 1561 阅读 · 0 评论 -
超级详细解释KMP算法(next数组的前世今生)
KMP算法文章目录KMP算法KMP算法的作用KMP算法的思想算法4中的KMP算法KMP算法思想KMP算法的表示怎么求解dfa数组求解`pre_next[]`例题描述示例1示例2KMP算法的作用可以在O(m+n)的时间复杂度内,在文本串S中找到模式串P是否存在。KMP算法的思想首先要想理解KMP算法,就必须先理解了解暴力解法的思想假设有文本串A B B B A A B B A模式串A B B A如果是暴力解法,那么会有两个指针,一个指针i指向文本串。一个指针j指向模式串。当j未走原创 2022-02-22 20:01:43 · 488 阅读 · 0 评论 -
无向图算法之CC算法
CC算法算法实现#include "graph.h"/* CC算法比union-find算法更慢.CC算法需要构建好一幅图 但是union-find算法是一种动态算法,可以在添加边的时候去检查两个顶点是否连通 */class CC { // 其实就是计算连通分量 public: CC(Graph G) { marked_.resize(G.V(), false); id_.resize(G.V()); for (int i = 0; i <原创 2022-01-07 15:29:42 · 894 阅读 · 0 评论 -
手把手教学拓扑排序
手把手教学拓扑排序文章目录手把手教学拓扑排序过程建图算法的流程自己图类的实现例题简单版本[207. 课程表](https://leetcode-cn.com/problems/course-schedule/)[851. 喧闹和富有](https://leetcode-cn.com/problems/loud-and-rich/)在图论中,**拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)**的所有顶点的线性序列。且该序列必须原创 2021-12-29 15:32:23 · 439 阅读 · 0 评论 -
每日算法学习之并查集(全网最详细)
并查集文章目录并查集作用原理实现优化路径压缩作用并查集能够解决图论中的动态连通性的问题什么是动态连通性满足下面三个特点自反性 节点p 节点q连通对称性 如果节点p节点q连通那么节点 q和节点p也连通传递性 节点a 节点b连通 节点b 节点c连通 那么 节点a 节点c连通原理视频链接文章链接其实原理也是很简单的首先维护一个parent[]的数组,数组的含义就是parent[i]代表 i的父节点是parent[i]初始化的时候大家都各自为政,所有人都是自己的父节点paren原创 2021-12-24 14:52:04 · 580 阅读 · 0 评论 -
Rabin-Karp算法(加速字符串匹配)
Rabin-Karp算法文章目录Rabin-Karp算法[1044. 最长重复子串](https://leetcode-cn.com/problems/longest-duplicate-substring/)Rabin-Karp算法的作用就是实现字符串的快速对比,判断字符串是否相同。算法的思想如下:将字符串进行编码,利用HashMap实现快速的匹配对比判断。所以关键是进行编码的规则,也就是利用hash函数进行编码映射。eg abcd abc编码为 22∗0+21∗1+20∗2=42^2*0+原创 2021-12-23 15:22:26 · 1092 阅读 · 0 评论 -
手把手教学前缀树
前缀树应用前缀匹配词频统计数据结果root节点 root = Trie()孩子节点 HashMap<char,Trie> children结束FLag bool isEnd/isword 判断是否是数字对应的值 string val题目推荐leetcode 208leetcode 720leetcode 692208. 实现 Trie (前缀树)难度中等923Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符原创 2021-10-22 10:02:25 · 151 阅读 · 0 评论 -
手把手教学----------带你手撕LFU
手把手带你手撕LFU文章目录手把手带你手撕LFU代码LFU的淘汰策略是优先淘汰最久的使用频率最低的那个所以第一步put如果没有超过容量,需要知道key对应的插入那么一个频率块,需要知道当前的频率块在里面删除如果超过了,要知道最小的频率在哪里get快速知道key对应的value在哪里需要快速的删除,插入所以我们设计如下struct Node: 包括key value freq 三个属性unordered_map<int,List<Node>>原创 2021-10-18 14:37:04 · 196 阅读 · 0 评论 -
手把手带你手撕差分
手把手带你手撕差分文章目录手把手带你手撕差分概念例题[1109. 航班预订统计](https://leetcode-cn.com/problems/corporate-flight-bookings/)概念例题1109. 航班预订统计难度中等206这里有 n 个航班,它们分别从 1 到 n 进行编号。有一份航班预订表 bookings ,表中第 i 条预订记录 bookings[i] = [firsti, lasti, seatsi] 意味着在从 firsti 到 lasti (包含 fir原创 2021-08-31 11:03:05 · 113 阅读 · 0 评论 -
手把手教学堆排序
手把手教学堆排序文章目录手把手教学堆排序堆排序的一般步骤手动模拟建堆的过程c++代码实现堆排序的一般步骤用数组表示二叉树(完全二叉树,也就是插入的顺序必须是从左到右从上到下),同时进行建堆堆顶的元素与堆最后一个元素交换,断开最后一个的链接,维护剩下的n-1个堆再对剩下的n-1个元素进行步骤2重复到堆里面只有一个元素,或者没有元素为止Tip 数组表示二叉树,下标为i的父节点是 (i-1)/2 下标为i的左子节点是 i*2+1 下标为i的右子节点是 i*2+2建堆的时间复杂度是 O(原创 2021-08-30 19:00:35 · 176 阅读 · 0 评论 -
全网最详细解释tarjan算法
tarjan算法tarjan算法是为了计算强连通分量的强连通分量也就是在有向图当中,能够双方都能够到达对方的点集视频链接代码实现#include <bits/stdc++.h>using namespace std;int times = 1; // 时间搓stack<int> st; // 栈vector<int> dfn; // 访问的时间点vector<int> low; // 能够回溯到的最小时间点vecto原创 2021-08-20 21:24:42 · 3670 阅读 · 0 评论 -
手把手带你手撕HashMap
文章目录HashMap的优缺点怎么解决hash冲突手撕hashmapHashMap的优缺点优点增删查找时间复杂度o(1)缺点key不能重复,在数据很多相同的时候不适合里面的内容是随机的不是有序的,所以面对有序的处理不行,比如说顺序输出还有就是要知道数组开辟的大小,如果开辟小了,hash冲突的很严重那么链表查询的时候时间就会增加,这时候就要扩容,那么里面所有的hash都需要重新进行hash存储了怎么解决hash冲突开放地址法 (冲突了往下找)链表法 (数组里面放的是链表,这也是我原创 2021-08-06 16:39:02 · 402 阅读 · 0 评论 -
简单化写法解决二分
简单化写法解决二分找到不小于某个值的最左边的数字#include <algorithm>#include <iostream>#include <vector>using namespace std;int bfind( vector<int>& data, int target) { // 函数是在data中找到第一个不小于target的数,相当于lower_bound int l = 0; int r =原创 2021-08-06 10:25:42 · 78 阅读 · 0 评论 -
带你手撕前缀和
带你手撕前缀和文章目录带你手撕前缀和参考构造二维前缀和的三种方法例题参考linklink1构造二维前缀和的三种方法先计算第一行与第一列再进行别的计算先固定行计算每一行的前缀和,再固定相应行的列的前缀和增加一维直接计算 pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+data[i][j]不说了上代码// 这里讲的是二维的差分数组的应用#include <iostream>#include <vector>原创 2021-07-30 22:04:01 · 106 阅读 · 0 评论 -
带你手撕单调栈(二)
带你手撕单调栈(二)思路请看描述给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个柱子高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例1输入:[3,1,2,5,2,4] 复制返回值:5 复制说明:数组 [3,1,2,5,2,4] 表示柱子高度图,在这种情况下,可以接 5个单位的雨水,蓝色的为雨水 示例2输入:[4,5,1,3,2]返回值:2 class Solution {public: /** * max wa原创 2021-07-23 09:58:08 · 201 阅读 · 0 评论 -
带你手撕单调栈(一)
单调栈文章目录单调栈是么时候用单调栈怎么用好单调栈模板例题[739. 每日温度](https://leetcode-cn.com/problems/daily-temperatures/)正序倒序+哨兵[496. 下一个更大元素 I](https://leetcode-cn.com/problems/next-greater-element-i/)前序遍历后序遍历+哨兵是么时候用单调栈一定要记住的是数据结构一定是辅助我们解题的,一定是在暴力解法的方式下进行优化(其实也就是以空间换时间)单调栈一定要符原创 2021-07-21 16:49:26 · 233 阅读 · 0 评论 -
手把手教学滑动窗口
滑动窗口滑动窗口主要思考以下几个问题(1)当移动right应当更新什么数据(2)什么条件下要停止扩大开始收缩left(3)left缩小应该更新什么数据(4)我们要的结果是在扩大时候更新还是缩小的时候更新/* 滑动窗口算法框架 */void slidingWindow(string s, string t) { unordered_map<char,int> need,window; for (char c:t) need[c]++; int left=0,原创 2021-07-12 10:22:22 · 275 阅读 · 0 评论 -
回溯之分割子集
文章目录[131. 分割回文串](https://leetcode-cn.com/problems/palindrome-partitioning/)[93. 复原 IP 地址](https://leetcode-cn.com/problems/restore-ip-addresses/)[90. 子集 II](https://leetcode-cn.com/problems/subsets-ii/)131. 分割回文串难度中等668收藏分享切换为英文接收动态反馈给你一个字符串 s,请你将 s 分割成原创 2021-07-12 10:21:25 · 247 阅读 · 0 评论 -
如何转化01背包问题
01背包问题的转化类型文章目录01背包问题的转化类型[494. 目标和](https://leetcode-cn.com/problems/target-sum/)[1049. 最后一块石头的重量 II](https://leetcode-cn.com/problems/last-stone-weight-ii/)494. 目标和难度中等796给你一个整数数组 nums 和一个整数 target 。向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 :例如原创 2021-07-12 10:19:28 · 208 阅读 · 0 评论 -
前缀和与差分
前缀和与差分文章目录前缀和与差分前缀和[523. 连续的子数组和](https://leetcode-cn.com/problems/continuous-subarray-sum/)解法一解法二差分前缀和前缀和的优势:以(o1)的时间复杂度得到某块区间的总和523. 连续的子数组和难度中等262给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组:子数组大小 至少为 2 ,且子数组元素总和为 k 的倍数。如果存在,返回 true原创 2021-07-12 10:18:01 · 96 阅读 · 0 评论 -
手撕排序算法(下)
排序算法(下)文章目录排序算法(下)快速排序快速排序是原地排序吗快速排序是稳定的排序算法吗快速排序算法的时间复杂度度算法实现归并排序归并排序是原地排序吗归并排序是稳定的排序算法吗归并排序算法的时间复杂度度算法实现快速排序快排的思想是这样的:如果要排序数组中下标从 p 到 r 之间的一组数据,我们选择 p 到 r 之间的任意一个数据作为 pivot(分区点)。我们遍历 p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间。经过这一步骤之后,数原创 2021-07-09 10:54:28 · 107 阅读 · 0 评论 -
手撕排序算法(上)
排序算法(上)文章目录排序算法(上)算法指标冒泡排序冒泡排序是原地排序吗冒泡排序是稳定的排序算法吗冒泡排序算法的时间复杂度度算法实现插入排序插入排序是原地排序算法吗插入排序是稳定的排序算法吗插入排序算法的时间复杂度度算法实现选择排序选择排序是原地排序算法吗选择排序是稳定的排序算法吗选择排序算法的时间复杂度度算法实现总结算法指标时间复杂度空间复杂度(是否是原地排序)算法的稳定性仅仅用执行效率和内存消耗来衡量排序算法的好坏是不够的。针对排序算法,我们还有一个重要的度量指标,稳定性。这个概念是说,原创 2021-07-05 10:32:10 · 112 阅读 · 0 评论 -
C++-----------------数据结构优先队列
优先队列文章目录优先队列定义:priority_queue在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。首先要包含头文件#include<queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队。优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。参考堆就是如下二叉树,原创 2021-06-24 16:07:36 · 134 阅读 · 0 评论 -
数据结构之----------单调队列
单调队列单调队列的作用就是维持某一个区间的最值其中有两个版本根据下标来进行维护单调队列根据值来维护单调队列239. 滑动窗口最大值难度困难1036给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例 1:输入:nums = [1,3,-1,-3,5,3,6,7], k = 3输出:[3,3,5,5,6,7]解释:滑动窗口的位置原创 2021-06-20 14:52:52 · 120 阅读 · 0 评论 -
多指针应用-------三数之和与四数之和
15. 三数之和难度中等3421给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 *a,b,c ,*使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。**注意:**答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[]class Solution原创 2021-06-16 16:23:53 · 209 阅读 · 0 评论 -
动态规划之--------基本时间序列型dp
基本时间序列型文章目录基本时间序列型动态规划的特点那么什么是基本时间序列型特点套路[198. 打家劫舍](https://leetcode-cn.com/problems/house-robber/)[213. 打家劫舍 II](https://leetcode-cn.com/problems/house-robber-ii/)[122. 买卖股票的最佳时机 II](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/)[原创 2021-06-11 14:16:02 · 542 阅读 · 1 评论 -
关于完全背包的遍历形式详解
关于完全背包的遍历问题文章目录关于完全背包的遍历问题结论[518. 零钱兑换 II](https://leetcode-cn.com/problems/coin-change-2/)[377. 组合总和 Ⅳ](https://leetcode-cn.com/problems/combination-sum-iv/)由上一篇博客我们知道,在纯完全背包问题中,是不在乎物品被放入的顺序的,也就是说你想怎么放你就怎么放,有序无序都无所谓,但是有的完全背包问题却更放入的顺序有关,这时候顺序的问题就直接体现在遍历原创 2021-05-28 19:41:03 · 851 阅读 · 0 评论 -
01背包与完全背包详解
背包问题文章目录背包问题dp定义关于背包的两个关键点01背包二维先遍历物品先遍历背包一维(倒着遍历防止被重复放入,详解看图)完全背包什么是完全背包问题[279. 完全平方数](https://leetcode-cn.com/problems/perfect-squares/)先遍历物品后遍历背包先遍历背包后遍历物体状态压缩过程要考虑插入顺序的完全背包问题只需要知道0-1背包和完全背包问题就完全足够了0-1背包有以下的特点有限个物体(有重量和价值),每个物体只有一个每个物体你都可以任选,可选也可原创 2021-05-28 19:39:37 · 4251 阅读 · 0 评论 -
LeetCode 动态规划0-1背包问题
class Solution {public: int coinChange(vector<int>& coins, int amount) { // 转化为01背包问题描述 // 给你一个总重量是amount的书包和N个物体,每个物体的重量已经给出,问是否有一种装法能够把背包装满 /* 典型的背包问题 */ /* 所以要明确两点 【状态】 【选择】 【状态】 :在运算过程中会变化原创 2021-02-03 19:58:11 · 183 阅读 · 1 评论 -
梯度下降法
博文目录1. 概述2. 梯度下降算法2.1 场景假设2.2 梯度下降2.2.1 微分2.2.2 梯度2.3 数学解释2.3.1 α2.3.2 梯度要乘以一个负号3. 实例3.1 单变量函数的梯度下降3.2 多变量函数的梯度下降4. 代码实现4. 1 场景分析4. 2 代码5. 小结1. 概述梯度下降(gradient descent)在机器学习中应用十分的广泛,不论是在线性回归还是Logistic回归中,原创 2020-11-22 13:04:00 · 207 阅读 · 0 评论