数据结构&&算法
文章平均质量分 81
爱吃香菜和葱
菜鸟一枚,多多指教
展开
-
KMP算法详解
问题简单描述:给定字符串s和模式串p,求模式串p在字符串s中出现的位置(所有位置都要给出),假设给定字符串s="ababcdabcabcd",模式串p="abcd"朴素思路解法暴力搜索:模式串逐个向右移动,复杂度O(M*N)//字符串sa b c a b c a b k //模式串 a b c a b k a b c a b c a b k a b c a b k a b c a b c a b k a b c a b c a b k原创 2022-04-24 10:50:15 · 466 阅读 · 0 评论 -
贪心相关题目
621. 任务调度器给你一个用字符数组tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或者处于待命状态。然而,两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。你需要计算完成所有任务所需要的 最短时间 。示例 1:输入:tasks = ["..原创 2022-05-08 11:53:49 · 330 阅读 · 0 评论 -
数组相关题目
前缀和相关前缀和相关题目主要出现在要求解满足某种条件的连续子数组个数,同时在二叉树中也有437. 路径总和 III,满足某种条件的路径的数目,根据数组的前缀和,很容易快速得到某个子数组的和,同时,在这里还有一个小技巧在于,用哈希表存储前缀和时,使用第一项为sum、第二项为sum的个数时可以更加快速求解出满足条件的子数组的个数<sum, num>560. 和为 K 的子数组给你一个整数数组 nums 和一个整数k ,请你统计并返回 该数组中和为k的子数组的个数。...原创 2022-04-11 10:55:19 · 1293 阅读 · 0 评论 -
并查集相关
并查集被很多OIer认为是最简洁而优雅的数据结构之一,主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作:合并(Union):把两个不相交的集合合并为一个集合。 查询(Find):查询两个元素是否在同一个集合中。亲戚问题问题描述:若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也..原创 2022-04-06 14:48:07 · 220 阅读 · 0 评论 -
最小生成树&最短路径问题
知识点回顾:最小生成树最小生成树算法主要有Prime算法和Kruskal算法,Prime算法主要是从构造的已有的最小生成子集中不断扩充子集,在扩充子集时满足新加入的那条边要是最小的。Kruskal算法主要是从边的角度出发,每次都从待选边中选择权值最小并且不会构成环的那条边。Prime算法模板代码:#include "bits/stdc++.h"using namespace std;//定义图中节点的数量# define NUM 10000//定义节点间的最大距离# de原创 2022-04-01 11:39:36 · 274 阅读 · 0 评论 -
递归、栈类题目
394. 字符串解码给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像3a或2[4]的输入。示例 1:输入:s = "3[a]2[bc]"输出:"aaa...原创 2022-03-31 10:05:01 · 126 阅读 · 0 评论 -
数学类相关题目
目录HJ6 质数因子338. 比特位计数HJ6 质数因子描述功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为22335)数据范围:1 \le n \le 2 \times 10^{9} + 14 \1≤n≤2×109+14输入描述:输入一个整数输出描述:按照从小到大的顺序输出它的所有质数的因子,以空格隔开。示例1输入:180复制输出:2 2 3 3 5思路...原创 2022-03-30 16:19:46 · 378 阅读 · 0 评论 -
STL模板操作以及字符串操作相关
主要是熟悉各种STL模板的使用347. 前 K 个高频元素给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]#include "bits/stdc++.h"using namespace std;class Solution {public.原创 2022-03-29 16:25:27 · 494 阅读 · 0 评论 -
二分查找及其变体
目录33. 搜索旋转排序数组34. 在排序数组中查找元素的第一个和最后一个位置33. 搜索旋转排序数组整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, ...原创 2022-03-16 20:54:01 · 431 阅读 · 0 评论 -
树:深度优先遍历、广度优先遍历相关
深度优先遍历模板:void dfs(int u, int v, vector<vector<pair<int, double>>> edges, vector<double> &out){ //对u节点进行dfs遍历,v是目标节点 if(u == v) return; for(const auto& node_val: edges[u]){ ..原创 2022-03-01 10:58:18 · 342 阅读 · 0 评论 -
链表相关题目
141. 环形链表给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。示例 1:输入:head = [3,2,0,-4],原创 2022-01-19 09:42:10 · 307 阅读 · 0 评论 -
并查集算法
并查集(Disjoint-Set)是一种可以动态维护若干个不重叠的集合,并支持合并与查询两种操作的一种数据结构并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。并查集有两个基本操作:Find: 查找元素所属子集 Union:合并两个子集为一个新的集合可以使用树这种数据结构来表示集合,不同的树就是不同的集合,并查集中包含了多颗树,表示并查集中不同的子集,树的集合是森林,所有并查集属于森林。基础操作初始化:/原创 2022-01-12 13:53:44 · 363 阅读 · 1 评论 -
一些不知道怎么归类的题目
128. 最长连续序列给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n) 的算法解决此问题。示例 1:输入:nums = [100,4,200,1,3,2]输出:4解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。示例 2:输入:nums = [0,3,7,2,5,8,4,6,0,1]输出:9class Solution {public: int lon.原创 2022-01-10 13:55:04 · 227 阅读 · 0 评论 -
二叉树相关
关于二叉树的建立、前序、中序、后序遍历可以参考二叉树遍历实现98. 验证二叉搜索树给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入:root = [2,1,3]输出:true/** * Definition for a binary tree node. * struct .原创 2021-09-26 10:47:17 · 332 阅读 · 0 评论 -
分治算法总结
分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。基本思想当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它.原创 2021-09-10 19:57:30 · 1307 阅读 · 0 评论 -
一些杂七杂八的东西
对于结构体的排序,见如下代码:struct interval{ int begin, end;};static bool Cmpare(const interval &a, const interval &b) { return a.begin <= b.begin;}vector<interval> vec;sort(vec.begin(), vec.end(), Cmpare);对于vector按照第一维数据排序,见如下代码:v原创 2021-09-10 19:57:07 · 332 阅读 · 0 评论 -
二叉树遍历实现
在二叉树的操作中,二叉树的遍历是基本的操作,对于二叉树的遍历操作,主要分为:前序遍历 中序遍历 后序遍历 层次遍历直接见代码:#include <iostream>#include <stack>#include <queue>#include <malloc.h>using namespace std;typedef struct BiTNode{ int data; struct BiTNode *left,原创 2021-08-24 19:31:02 · 367 阅读 · 0 评论 -
贪心算法总结
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。基本思路建立数学模型来描述问题; 把求解的问题分成若干个子问题; 对每一子问题求解,得到子问题的局部最优解; 把子问题的解局部最优解合成原来解问题的一个解。一些典型例题活动安排问题.原创 2021-08-21 11:10:40 · 856 阅读 · 2 评论 -
单调栈技术&&单调队列
单调栈的定义:单调栈即满足单调性的栈结构。与单调队列相比,其只在一端进行进出。原创 2021-08-18 15:42:22 · 150 阅读 · 0 评论 -
动态规划归纳
目录线性DP最长递增子序列最长公共子序列32. 最长有效括号背包DP经典背包问题常见的动态规划问题可以分为以下几类:线性DP、区间DP、背包DP、树形DP等,当然除此之外,还有状态压缩DP、数位DP、计数型DP、递推型DP、概率型DP、博弈型DP、记忆化搜索等,线性DP最长递增子序列dp[i]表示以nums[i]结尾的子序列的最大长度则dp[i] = max(dp[j] + 1) for j in [0...i-1] and nums[i] >= nums[原创 2021-08-15 17:18:41 · 906 阅读 · 0 评论 -
排序算法总结及实现
归并排序算法思路可以参见如下图:#include "bits/stdc++.h"using namespace std;//此部分代码为归并排序的实现void merge(int a[], int low, int middle, int high){ //此部分代码为将a[low1: middle]与a[middle+1: high]合并 int p=low, q=middle+1, k=0; int *temp = new int[hi.....原创 2021-08-14 17:13:10 · 113 阅读 · 0 评论 -
回溯-剪枝
回溯算法也可以认为是某种程度的暴力穷举,但是在暴力穷举的过程中,可以根据解的相关性质将不满足条件的解及时剪枝相关例题括号生成数字 n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 1:输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]class Solution {public: vector<string> vec; void df...原创 2021-08-13 17:03:07 · 755 阅读 · 0 评论 -
双指针技术&&滑动窗口
双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。这里需要理解的是:双指针也还是相当于在对元素进行两重循环遍历,但此处的双指针根据某些性质完美地省略了许多需要遍历的空间。可以参考以下两题盛最多水的容器给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点(i,ai) 。在坐标内画 n 条垂直线,垂直线 i的两个端点分别为(i,ai) 和 (i, 0) ......原创 2021-08-09 16:00:01 · 737 阅读 · 0 评论 -
堆排序实现
大顶堆:当前节点值大于其左右节点,可用来计算top K小的元素 小顶堆:当前节点值小于其左右节点,可用来计算top K大的元素 #include <bits/stdc++.h>using namespace std;/*堆排序算法实现:大顶堆的建立,以及堆的维护当前节点大于其左右节点,每次筛选出最大的节点,可以维持最小的K个元素算法时间复杂度,O(nlogn)*/void HeapAdjust(int a[], int len, int index){ //原创 2021-07-15 20:57:25 · 129 阅读 · 3 评论 -
快速排序实现
#include <bits/stdc++.h>using namespace std;/*实现了快速排序算法基本思想:1.从数列中挑出一个元素,称为 "基准"(pivot);2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;素一般情.原创 2021-07-15 11:15:07 · 124 阅读 · 0 评论 -
表达式计算
本博客主要介绍了利用栈来实现数据结构中表达式的相关计算。主要包括:中缀表达式、前缀表达式、后缀表达式计算,中缀转前缀、中缀转后缀等等原创 2019-08-09 09:40:58 · 302 阅读 · 0 评论 -
内部排序汇总
#include <iostream>#include <vector>#include <math.h>using namespace std;//内部排序汇总void Insert_sort(int a[], int len){ //直接插入排序,时间复杂度:O(n^2) //最好的情况,例如排列基本有序:O(n^2) ...原创 2019-08-08 14:54:53 · 116 阅读 · 0 评论