数据结构与算法
文章平均质量分 93
南七行者
相信时间会创造奇迹。
展开
-
【刷力扣】23. 合并 K 个升序链表(dummy节点技巧 + 分治思维 + 优先队列)
一棵由k个元素组成的完全二叉树,其树高为logk。没必要一次性将所有node都加入优先队列。我们这里用到的优先队列,本质是。原创 2024-06-15 22:50:29 · 786 阅读 · 1 评论 -
最通俗易懂的求next数组的方法(KMP算法)
一、字符串匹配的KMP算法相信小伙伴们看了阮一峰老师讲解的KMP算法后也会有醍醐灌顶的感觉。可惜,阮老师没有去讲如何求部分匹配表(Partial Match Table),但这也是写出KMP算法的关键所在。所以,我打算再详细讲讲如何求部分匹配表,也即next数组。二、求部分匹配表(next数组)1.部分匹配值①前缀1个字符串除去末尾字符,以首字符开头的所有子串。②后缀1个字符串除去首字符,以末尾字符结尾的所有子串。比如:字符串:ABCDAB前缀:A、AB、ABC、ABCD、ABCDA原创 2021-05-24 23:14:25 · 12149 阅读 · 4 评论 -
通俗易懂:P问题、NP问题、NPC问题和NP-hard问题
一、基础知识1.现实中的问题(比如:排序问题),存在很多解决办法(即计算机领域的算法),所以需要衡量算法的性能。一个算法的优劣主要从算法的执行时间(即时间复杂度)和所需要占用的存储空间(即空间复杂度)两个方面衡量。P类问题和时间复杂度有关,所以本文只谈时间复杂度。2.时间复杂度若对排序算法有了解的小伙伴,大多是知道冒泡排序的平均时间复杂度为O(n2n^2n2),按照多项式的定义(形如an⋅xn+an−1⋅xn−1+...+a1⋅x+a0a_n·x^n + a_{n-1}·x^{n-1} + .原创 2020-11-10 13:36:27 · 3813 阅读 · 0 评论 -
vector的常见用法总结(find、assign、front、back等函数)
一、前言但凡对C++STL了解的小伙伴,大多已经熟知vector的如下用法:(0)vector头文件#include <vector>using namespace std;(1)vector的定义vector<typename> name;eg:vector<int> V;(2)vector容器内元素的访问①通过下标访问和访问普通素数一样:V[i],i∈[0,count−1]V[i], i\in[0, count - 1]V[i],i∈[0,原创 2020-11-08 21:03:01 · 2675 阅读 · 0 评论 -
给定二叉树的中序遍历和后序遍历,不建树求其层序遍历(PAT A1020)
一、问题描述我这篇博文经典二叉树遍历问题的总结,留下了一个坑,即给定二叉树的中序遍历和后序遍历,不建树求其层序遍历,现来填坑了。二、中序遍历 + 后序遍历 -> 层序遍历既然已经会了(中序遍历 + 后序遍历 -> 前序遍历),那么在求前序遍历的过程中,给结点附加上index,再把index按小到大排序,此时结点序列正是层序遍历啊总结:层序遍历不仅可以利用队列 + BFS来求,还可以利用index从小到大的特点来求。①代码如下://给定二叉树的中序遍历和后序遍历,不建树求其层序遍历原创 2020-11-07 15:39:28 · 496 阅读 · 0 评论 -
经典二叉树遍历问题的总结(LeetCode 105 和 106)
经典二叉树遍历问题_仅指我个人的定义1.第1类(给遍历,构造树)(1)从中序与前序遍历构造二叉树(2)从中序与后序遍历构造二叉树(3)从中序与层序遍历构造二叉树2.第2类(给遍历,求遍历)(1)中序遍历 + 前序遍历 -> 后序遍历 || 层序遍历(2)中序遍历 + 后序遍历 -> 前序遍历 || 层序遍历(3)中序遍历 + 层序遍历 -> 前序遍历 || 后序遍历3.总结1.第1类(给遍历,构造树)(1)从中序与前序遍历构造二叉树①代码少,但性能一般/** * Definiti原创 2020-11-07 14:21:15 · 473 阅读 · 0 评论 -
用Monte Carlo算法实现素数判定
[2, ⌊n⌋\lfloor n \rfloor⌊n⌋]原创 2020-11-03 15:01:53 · 478 阅读 · 0 评论 -
由完全二叉树的层序遍历构建完全二叉树(2种方法实现)
由完全二叉树的层序遍历构建完全二叉树原创 2020-10-30 10:57:22 · 7701 阅读 · 6 评论 -
实现n皇后问题的多种解法
一、问题定义将n个皇后放置在n∗nn*nn∗n的棋盘上,要求任意2个皇后,满足:①不在同一行②不在同一列③不在同一对角线二、回溯法#include <cstdio>#include <set>#include <vector>using namespace std;//回溯法void Print(int N, vector<int> placeResult, int ans) { printf("第%d种放置方案:\n", an原创 2020-10-23 14:16:15 · 2734 阅读 · 0 评论 -
Sherwood算法求解离散对数问题
一、离散对数问题1.定义设a=gx mod pa = g ^ x\;mod\;pa=gxmodp,记logg, pa=xlog_{g,\;p} a = xlogg,pa=x,称x为a的对数(以g为底,模p)。给定p, g, a计算x称为离散对数问题。2.应用之一:加密若g,p已知,x为私钥,求a公钥很容易,即解密;若g,p已知,a为公钥,求x公钥很困难(p是很大的质数更难),即破解困难(下文将描述);二、简单算法根据费马小定理(ap−1 mod p=1a^{p - 1}\;mod原创 2020-10-11 19:52:05 · 885 阅读 · 2 评论 -
三种方法实现选择问题
一、选择问题选择问题(selection problem)是求一数组(n个数)中第k(k <= n)个最小元素的问题。二、三种方法实现1.确定算法①Lomuto划分②Hoare划分2.非确定算法(概率算法)③sherwood算法三、Lomuto划分1代码:#include <iostream>#include <cstdio>using namespace std;void swap(int* a, int* b) { int temp;原创 2020-10-11 10:57:58 · 2633 阅读 · 0 评论