算法与数据结构
文章平均质量分 58
litanyuan
这个作者很懒,什么都没留下…
展开
-
单调队列算法总结
单调队列算法总结原创 2022-12-07 13:08:45 · 712 阅读 · 0 评论 -
C++ 线段树的实现总结
C++ 线段树的实现总结原创 2022-07-21 12:45:21 · 404 阅读 · 0 评论 -
字符串匹配 RK 算法总结
字符串匹配 RK 算法总结原创 2022-07-02 12:40:06 · 347 阅读 · 0 评论 -
LeetCode-732. 我的日程安排表 III,差分数组
差分数组的应用原创 2022-06-06 10:52:55 · 1188 阅读 · 0 评论 -
LeetCode-剑指 Offer II 114. 外星文字典,BFS 搜索算法及图的表示
LeetCode-剑指 Offer II 114. 外星文字典,图的表示方法、BFS算法原创 2022-05-31 12:59:52 · 104 阅读 · 0 评论 -
LeetCode-380. O(1) 时间插入、删除和获取随机元素
STL综合应用原创 2022-04-13 12:59:46 · 291 阅读 · 0 评论 -
LeetCode-1606. 找到处理最多请求的服务器、C++中优先队列的使用
LeetCode-1606. 找到处理最多请求的服务器、C++中优先队列的使用原创 2022-03-31 13:55:44 · 497 阅读 · 0 评论 -
LeetCode-688. 骑士在棋盘上的概率
LeetCode-688. 骑士在棋盘上的概率 深度优先算法原创 2022-02-18 13:25:44 · 339 阅读 · 0 评论 -
C++ 中std::bitset的使用总结
C++ bitset的使用原创 2022-02-15 13:08:19 · 5396 阅读 · 0 评论 -
LeetCode-135.分发糖果、贪心算法
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻的孩子中,评分高的孩子必须获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?示例 1:输入: [1,0,2]输出: 5解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。示例 2:输入: [1,2,2]输出: 4解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。第三个孩子只得到 1 .原创 2020-12-24 08:26:59 · 189 阅读 · 0 评论 -
LeetCode-321.拼接最大数、单调栈
给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字。现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。求满足该条件的最大数。结果返回一个表示该最大数的长度为 k 的数组。说明: 请尽可能地优化你算法的时间和空间复杂度。示例 1:输入:nums1 = [3, 4, 6, 5]nums2 = [9, 1, 2, 5, 8, 3]k = 5输出:[9, 8, 6, .原创 2020-12-02 10:39:06 · 286 阅读 · 0 评论 -
LeetCode-450.删除二叉搜索树中的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。说明: 要求算法时间复杂度为 O(h),h 为树的高度。来源:力扣(LeetCode)题目分析①.二叉搜索树的性质:左子树的节点值都小于根节点值;右子树的节点值都大于根节点值②.若为叶子节点,则直接删除即可,不影响二叉搜索树的性质③.若只有一.原创 2020-11-19 11:19:58 · 104 阅读 · 0 评论 -
LeetCode-1024.视频拼接、贪心算法
你将会获得一系列视频片段,这些片段来自于一项持续时长为 T 秒的体育赛事。这些片段可能有所重叠,也可能长度不一。视频片段 clips[i] 都用区间进行表示:开始于 clips[i][0] 并于 clips[i][1] 结束。我们甚至可以对这些片段自由地再剪辑,例如片段 [0, 7] 可以剪切成 [0, 1] + [1, 3] + [3, 7] 三部分。我们需要将这些片段进行再剪辑,并将剪辑后的内容拼接成覆盖整个运动过程的片段([0, T])。返回所需片段的最小数目,如果无法完成该任务,则返回 -1 .原创 2020-10-24 10:08:49 · 7057 阅读 · 0 评论 -
LeetCode-143.重排链表
给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:给定链表 1->2->3->4, 重新排列为 1->4->2->3.示例 2:给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.来源:力扣(LeetCode)方法一本题最直接的方法把.原创 2020-10-20 09:32:01 · 155 阅读 · 0 评论 -
LeetCode-214.最短回文串、KMP算法字符串匹配
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。示例 1:输入: “aacecaaa”输出: “aaacecaaa”示例 2:输入: “abcd”输出: “dcbabcd”来源:力扣(LeetCode)题目分析s1 表示 s 的反转字符串。题目可以转换为查找 s1 的后缀和 s 的前缀最长重合的部分,即用 s 去匹配 s1 即可,s 的匹配剩余部分加到 s1 末尾即可。代码示例class Solution {publ.原创 2020-08-29 16:38:12 · 367 阅读 · 0 评论 -
LeetCode-336.回文对、字典树、字符串翻转
给定一组唯一的单词, 找出所有不同 的索引对(i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串。示例 1:输入: [“abcd”,“dcba”,“lls”,“s”,“sssll”]输出: [[0,1],[1,0],[3,2],[2,4]]解释: 可拼接成的回文串为 [“dcbaabcd”,“abcddcba”,“slls”,“llssssll”]来源:力扣(LeetCode)第336题字典树概念字典树又称单词查找树、前缀树,是一种树形结构,利.原创 2020-08-06 10:09:18 · 300 阅读 · 0 评论 -
二分查找的各种应用详解(C++)
基本概念Binary Search二分查找也称折半查找,它是一种效率较高的查找方法;使用二分查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。基本原理①.查找:因为序列已经单调且有序排列,从中间位置开始比较,一次可以排除一半的数据,不断缩小查找范围;②.终止条件:找到了目标值,或者左右边界已经构不成有效区间;③.左右边界:理想情况下右边界不断缩小以逼近目标位置,左边界不断增大以逼近目标位置。查找等于 key 的元素位置// target == key// 找到目原创 2020-07-17 09:44:48 · 513 阅读 · 0 评论 -
二叉查找树的 c++实现
基本概念BST二叉查找树又称二叉搜索树或者二叉排序树;它可以是一个空树或者是一个二叉树,既有链表的快速插入与删除的特点,又有数组快速查找的优势。基本性质二叉查找树非空时,具有以下性质:①.若左子树非空,则左子树所有节点均小于根节点的值②.若右子树非空,则右子树所有节点均大于跟节点的值③.左右子树也是二叉查找树④.没有键值相等的节点基本操作①.插入:插入一个新值②.查找:根据键值查找节点③.删除:根据键值删除节点其他①.前驱节点:所有节点从小到大到大排列后的小于本节原创 2020-07-16 11:23:10 · 357 阅读 · 0 评论 -
力扣刷题-面试题 17.13. 恢复空格、字典树、前缀树的应用
基本概念Trie 树又称单词查找树、前缀树,是一种树形结构。典型应用是用于统计、排序和保存大量的字符串(但不仅限于字符串)。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,比哈希表更快。基本性质①.根节点不包含字符,除根节点外每个节点都只包含一个字符②.从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串③.每个节点的所有子节点包含的字符都不相同基本操作①.插入:把一个单词插入到字典树②.查询前缀:判断某个单词是否为一个单词的前缀原创 2020-07-13 16:19:00 · 212 阅读 · 0 评论 -
力扣刷题-1300. 转变数组后最接近目标值的数组和
给你一个整数数组 arr 和一个目标值 target ,请你返回一个整数 value ,使得将数组中所有大于 value 的值变成 value 后,数组的和最接近 target (最接近表示两者之差的绝对值最小)。如果有多种使得和最接近 target 的方案,请你返回这些整数中的最小值。请注意,答案不一定是 arr 中的数字。来源:力扣(LeetCode)value 的取值范围①.最小值 value 的最小值为 0。因为当 value = 0 时,数组的和为 0,当 value 继续减.原创 2020-06-14 09:56:14 · 205 阅读 · 0 评论 -
力扣刷题-128.最长连续序列、并查集
一.并查集 顾名思义:并:就是合并,查:就是查找,集:就是集合。并查集是一种树形的数据结构,支持以下两种操作:查找:确定某个元素处于哪个子集合并:将两个子集合并成一个集合初始化集合就是一些具有相同特征的元素构成的圈子,然后用其中某个元素作为整个圈子的代表。如上图所示:初始的时候每个元素各自构成一个集合,自己为自己代言。合并可以用树形结构来表示整个集合,每个元素代表一个节点,用根节点代表整个集合。合并两个元素就是对两个元素所在的集合进行合并,即直接把一个集合的根节点作为另外一个集合根原创 2020-06-12 15:58:19 · 471 阅读 · 0 评论 -
力扣刷题-76. 最小覆盖子串、双指针、滑动窗口算法
一.概述双指针是一种解决问题的技巧或者思维方式,指在访问一个序列中的数据时使用两个指针进行扫描,两个指针可以是同向的,也可以是反向的;我们的关注点可以是这两个指针指向的两个元素本身,也可以是两个指针中间的区域。二.快慢指针概念快慢指针是两个指针同向移动,某一时刻来看两个指针一个在前,一个在后,即快指针和慢指针。造成两个指针一前一后的原因有两种情况:①.两个指针速度相同,但是出发时间不同,也可以认为是出发起始位置不同,在两个指针都出发后会以固定的距离间隔一前一后的向前移动;②.两个指针速度不同原创 2020-06-01 17:45:08 · 367 阅读 · 0 评论 -
力扣刷题-460.LFU缓存、STL容器使用总结
一.背景容器的概念一个容器就是一些特定类型对象的集合;它可以保存其他对象或者指向其他对象的指针,还提供了一系列处理其他对象的方法;容器类自动申请和释放内存,因此无需new和delete操作;容器本质的作用是对数据进行存储,学习容器的关键是掌握各种容器的特点及其对数据的增删改查的操作方法。容器的种类①.顺序容器 顺序容器为成员提供了控制元素存储以及的快速顺序访问元素的能力;元素顺序和元素值无关,依赖于元素添加时的次序。 vector:可变大小数组,从末尾快速的插入和删除,支持直原创 2020-05-27 16:54:34 · 410 阅读 · 0 评论 -
力扣刷题-1371.每个元音包含偶数次的最长子字符串、前缀和、动态规划
一.背景和为k的子数组给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。示例 1 :输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。来源:力扣(LeetCode)第560道题解题思路①.暴力穷举 可以对所有的子数组进行穷举,然后分别求和,和等于k则计数加1。//穷举所有子串[i,j]int countK = 0;for(int i = 0;i< nums.size();原创 2020-05-23 16:20:37 · 329 阅读 · 0 评论 -
力扣刷题-210.课程表Ⅱ、图的表示方式、BFS
一.图的基本概念定义和基本术语图是由节点以及连接这些节点边组成。①.无向图:每条边连接的两个节点可以双向访问。②.有向图:每条边连接的两个节点只能单向访问。③.出度:有向图的某个节点作为起点的次数和。④.入度:有向图的某个节点作为终点的次数和。⑤.权重:图中每条边分配的值;根据图的边是否有权重,可以分为带权图和无权图。应用举例①.社交网络 在社交网络中所有的用户构成了多对多的朋友关系网,这个关系网就是图:每个人都是图中的节点,互相认识的人之间通过边进行联系。如下图:原创 2020-05-22 10:20:07 · 430 阅读 · 0 评论 -
力扣刷题-56 - I. 数组中数字出现的次数、位运算的应用
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。c++位运算位运算计算机中是用二进制存储数据。一个字节包含8个位,每个“1”或者“0”就是一位。①.按位与:&两个位都是1结果才是1,只要有一个是0,结果就是0;a&1== 1//a末尾是1,a是奇数 ②.按位与...原创 2020-04-28 10:06:46 · 192 阅读 · 0 评论 -
快速排序算法
快速排序基本思想 快速排序是基于分治的思想实现的。一个有序的序列总可以分为两部分:找一个基准值把序列一分为二,左边的区间中原始值总是小于等于基准值,右边区间中元素值总数大于等于基准值。对左右两个区间采用相同的方法直到子区间的元素个数为1,则每个基准值的位置都已正确归位置。 基本实现思路: ①.选取一个基准值,一般选择起始位置的值。 ②.左右两端开始遍历,右侧区间中找一个小于基准...原创 2020-04-27 16:54:46 · 179 阅读 · 0 评论 -
力扣刷题-51.数组中的逆序对、归并排序、分治思想
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 示例 1: 输入: [7,5,6,4] 输出: 5分治思想 分治就是分而之,面对一个规模复杂的问题,把它分解成一系列的简单子问题,对子问题求解的结果进行合并从而实现对整个问题的求解。 通过不断的递归,每次尽可能的缩小问题的规模,直至满足基线条件;...原创 2020-04-24 14:23:56 · 308 阅读 · 0 评论 -
广度优先搜索(BFS)模版
BFS BFS是把每一层的所有节点都访问完后,再进行下一层的遍历。用队列(queue)保存将要访问的节点,并且要标记每个节点是否已访问过,以确保每个节点只访问一次。BFS常用来解决最短路径的问题。代码模版int depth = 0 # 记录遍历到第几层,当前在第几层则和源点的距离为几while( !queue.empty())//队列非空{ depth++;// i...原创 2020-04-22 11:03:38 · 172 阅读 · 0 评论 -
lower_bound和upper_bound
需要引用头文件 #include <algorithm>lower_bound采用二分查找在一个有序序列 [i,j) 中,返回第一个 >= 目标值的元素的迭代器 itupper_bound采用二分查找在一个有序序列 [i,j) 中,返回第一个 > 目标值的元素的迭代器 it使用示例 vector<int> nums = {0...原创 2020-04-15 16:25:06 · 114 阅读 · 0 评论