
C++
文章平均质量分 88
叶底藏花~
这个作者很懒,什么都没留下…
展开
-
二分关键——边界判断(是否满足条件)
二分非常重要的关键就是判断边界是否满足所需的条件!以下是我常用的两套模板模板一模板二(有两种用法)H 指数 II 来源:力扣(LeetCode)模板一的边界符合题目要求,而接下来的模板二就是笔者想讲的边界判断是否满足条件这只是千万二分类型的题目之一,二分的核心——边界判断掌握才是关键。找到 K 个最接近的元素 来源:力扣(LeetCode)解法一:二分查找有人对于的 有疑问,为什么是 和 比较而不是和 比较,还有 会不会超边界首先, 是相对于 的第 个数, 必然是符合题目条件原创 2022-07-06 13:28:06 · 339 阅读 · 1 评论 -
浅谈哈希表
散列表 ( Hash table ,也叫 哈希表 ),是根据 键 (Key)而直接访问在记忆体储存位置的 数据结构 。也就是说,它通过计算一个关于键值的函数,将所需查询的数据 映射 到表中一个位置来访问记录,这加快了查找速度。模拟散列表维护一个集合,支持如下几种操作:I x,插入一个数 x;Q x,询问数 x 是否在集合中出现过;现在要进行 N 次操作,对于每个询问操作输出对应的结果。输入格式第一行包含整数 N,表示操作数量。接下来 N 行,每行包含一个操作指令,操作指令为 I x,Q .原创 2021-08-16 10:05:04 · 1205 阅读 · 0 评论 -
浅谈并查集
合并集合一共有 n 个数,编号是 1∼n,最开始每个数各自在一个集合中。现在要进行 m 个操作,操作共有两种:M a b,将编号为 a 和 b 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;Q a b,询问编号为 a 和 b 的两个数是否在同一个集合中;输入格式第一行输入整数 n 和 m。接下来 m 行,每行包含一个操作指令,指令为 M a b 或 Q a b 中的一种。输出格式对于每个询问指令 Q a b,都要输出一个结果,如果 a 和 b 在同一集合内,则输出原创 2021-08-04 11:18:23 · 175 阅读 · 0 评论 -
Tire 树运用
Trie字符串统计维护一个字符串集合,支持两种操作:I x 向集合中插入一个字符串 x;Q x 询问一个字符串在集合中出现了多少次。共有 N 个操作,输入的字符串总长度不超过 105,字符串仅包含小写英文字母。输入格式第一行包含整数 N,表示操作数。接下来 N 行,每行包含一个操作指令,指令为 I x 或 Q x 中的一种。输出格式对于每个询问指令 Q x,都要输出一个整数作为结果,表示 x 在集合中出现的次数。每个结果占一行。数据范围1≤N≤2∗104输入样例:5I abc原创 2021-08-03 10:04:52 · 339 阅读 · 0 评论 -
浅谈双指针
常用双指针技巧可以分为两类,一类是「快慢指针」,一类是「左右指针」。笔者在本章只讲左右指针,主要解决数组(或者字符串)中的问题,比如二分查找,处理子序列。左右指针将给定的英文字符串进行反转。我们可以使用一头一尾的双指针。例如: I love cpp 得到的结果是:ppc evol I#include <iostream>#include <algorithm>#include <cstring>using namespace std;int main()原创 2021-08-02 12:30:54 · 206 阅读 · 0 评论 -
浅谈二分查找
如果我们有一个性质,能将一个区间划分成两部分,二分能将这个性质的边界求出来。原创 2021-07-30 16:34:03 · 246 阅读 · 0 评论 -
中位数技巧(推理+证明)
在有序序列中,中位数具有一些很优美的性质。定义中位数,又称中点数,中值。中位数是按顺序排列的一组数据中居于中间位置的数,即在这组数据中,有一半的数据比他大,有一半的数据比他小,这里用来表示中位数。(注意:中位数和众数不同,众数指最多的数,众数有时不止一个,而中位数只能有一个。) 有一组数据:将它按从小到大的顺序排序为:X1,X2,X3…Xn则当N为奇数时 mid=X(n+1)/2;当N为偶数时mid=(X(n/2)+x(n/2+1))/2 。一个数集中最多有一半的数值小于中位数,也最多有一半原创 2021-07-26 15:42:53 · 4509 阅读 · 0 评论 -
贪心(总结+例题)
贪心是什么?定义:所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。 也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。注意贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择算法思路贪心算法一般按如下步骤进行:建立数学模型来描述问题把求解的问题分成若干个子问题对每个子问题求解,得到子问题的局部最优解把子问题的解局部最优解合成原来解问题的一个解使用条件贪心选择性质一个问题的整体最优解可通过一系列局部的最优解的选择达原创 2021-07-22 16:25:30 · 1329 阅读 · 1 评论 -
曼哈顿距离(值得收藏)
曼哈顿距离定义出租车几何或曼哈顿距离(Manhattan Distance)是由十九世纪的赫尔曼·闵可夫斯基所创词汇 ,是种使用在几何度量空间的几何学用语,用以标明两个点在标准坐标系上的绝对轴距总和。两点在南北方向上的距离加上在东西方向上的距离d(i,j)=|X1-X2|+|Y1-Y2|数学性质非负性:d(i,j)≥0 距离是一个非负的数值同一性:d(i,i)= 0 对象到自身的距离为0对称性:d(i,j)= d(j,i)距离是一个对称函数三角不等式:d(i,j)≤d(i,k)+d(原创 2021-07-18 17:03:20 · 2398 阅读 · 0 评论 -
背包问题(动态规划)
DP大法,玄妙无比。动态规划的原理动态规划(dyanmic programming)与分治方法相似,都是通过组合子问题的解来求解原问题。 分治方法:将问题划分为互不相交的子问题,递归求解子问题,再将姐组合起来,求出原问题的解。 与之相反,动态规划应用于子问题重叠情况,即不同子问题具有公共的子子问题(将子子问题存入表格,只求解一次) 刻画最优解的结构特征。 利用计算信息构造一个最优解。 “动态规划算法通常利用重叠子问题性质:对每一个子问题求解一次,将解存入表中,再次需要直接查表。 ” 适合动态规划方法求原创 2021-07-12 16:18:10 · 276 阅读 · 0 评论 -
奇偶剪枝--非常巧妙的技巧
奇偶剪枝是数据结构的搜索中,剪枝的一种特殊小技巧。奇偶剪枝的原理两点之间的曼哈顿距离为奇数, 则只能在奇数步内到达,偶数同理。即:假设起点为(x1,y1),终点为(x2,y2),给定 step 步恰好走到终点,则 abs(x2-x1)+abs(y2-y1) 与 step 同奇偶。证明以图代证:一开始没有障碍,“#”表示可以走,S 到 E 的最短步数为6。接下来有障碍了,要绕路。黑色的路是最短路,蓝色是最短路的平移,不影响步数,所以只有红色的路是绕的路即多走的路。通过观察,可以发现一.原创 2021-07-10 17:11:08 · 397 阅读 · 0 评论 -
最短路径问题(Dijkstra常用用法总结)
最短路径问题(Dijkstra常用用法总结)Dijkstra简介:迪杰斯特拉算法(Dijkstra)是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。注意该算法要求图中不存在负权边。模拟过程更利于理解在理解Dijkstra的基础上,我们可以用Dijkstra可解决以下几种最短路问题:单源最短路问题(一个起点到一个终点 ) (可延伸到)—原创 2021-07-08 09:46:53 · 2117 阅读 · 1 评论