算法专题
文章平均质量分 90
你好世界wxx
Just do it!
展开
-
【算法专题】区间最大和
区间最大和1. 概述此类问题一般是:给出一个序列,让从中选出一些连续的不相交子序列,使得选出的子序列和最大。子区间长度可能不定,也可能固定。选出的区间数可能是一个,也可能是多个。如下给出了三个例题:Leetcode 0053 最大子序和:选出一个子区间,长度不定;AcWing 1051. 最大的和:选出两个子区间,长度不定;Leetcode 0689 三个无重叠子数组的最大和:选出三个子区间,长度都相同。可以扩展为选出多个子区间。2. 例题Leetcode原创 2021-12-08 21:21:46 · 6516 阅读 · 0 评论 -
【算法专题】环检测算法
环检测算法给定一个图,判断图中是否存在环,可以使用dfs求解,根据图的类型可以分为两种类型:(1)无向图判断是否有环;(2)有向图判断是否有环。1. 无向图环检测算法分析使用st数组记录在深度遍历的过程中是否存在点之前已经被遍历过,如果存在,说明存在环。注意为了消除无向边的影响,递归的过程中需要传入每个点的父节点fa。代码C++/* 测试用例3 31 22 33 1*/#include <iostream>#inclu原创 2021-12-05 22:12:28 · 1694 阅读 · 0 评论 -
【算法专题】K倍区间问题
力扣之连续子数组之和系列Leetcode 0523 连续的子数组和题目描述:Leetcode 0523 连续的子数组和分析本题的考点:前缀和、哈希表。首先求出原数组的前缀和数组s,对于某个s[i],我们希望判断 sum[i] - sum[i-2], sum[i] - sum[i-3], ... , sum[i] - sum[0] 是否存在k的倍数即可。相当于判断sum[i]和sum[k]是否同余即可(0<= k <=i-2),可以使用哈希表。代码C++原创 2021-07-08 10:00:37 · 1124 阅读 · 0 评论 -
【算法专题】数组中重复(缺失)的数字
【力扣】数组中重复(缺失)的数字剑指 Offer 03 数组中重复的数字题目描述:剑指 Offer 03 数组中重复的数字分析解法一本题的考点:数学,哈希表。本题中最常规的做法可以使用哈希表统计每个数据出现的次数,如果存在某个数据出现次数超过两次,返回即可。这里采用另一种做法,因为所有数据范围都在[0~n-1]之间,每次遍历到一个数据x=nums[i],如果nums[x]位置的数据为正数,则将nums[x]上的数据去相反数;如果nums[x]位置的数据为负数,则说明x第二原创 2021-12-01 10:57:09 · 660 阅读 · 0 评论 -
【算法专题】H指数
H指数1. 概述根据百度百科定义:H指数(H index):一名科研人员的 H 指数是指他(她)的 (n 篇论文中)总共有 h 篇论文分别被引用了大于等于 h 次。且其余的 n - h 篇论文每篇被引用次数小于等于 h 次。2. 例题Leetcode 0274 H指数题目描述:Leetcode 0274 H指数分析本题的考点:排序。将数组从大到小排序,然后根据引用次数从高到低是否有符合要求的论文即可。代码C++class Solution {原创 2021-11-26 11:20:13 · 2114 阅读 · 0 评论 -
【算法专题】字符串匹配
字符串匹配1. 概述字符串匹配的经典算法是KMP,关于KMP可以参考:网址。还会用到AC自动机,可以参考:AC自动机。这里不仅会讨论字符串匹配的情况,还会讨论不能含有某些字符串的情况。2. 例题AcWing 831. KMP字符串问题描述问题链接:AcWing 831. KMP字符串分析注意:p和s的下标都是从 1 开始的。具体分析如下图:代码C++#include <iostream>using namespace原创 2021-11-23 11:48:31 · 653 阅读 · 0 评论 -
【算法专题】开关问题
开关问题1. 概述此类问题有一个共同的特点,即如果当前位置状态发生变化时,会有一些位置跟着变化。我们需要求解出从初始状态到达终止状态需要的最少步数。2. 例题AcWing 1208. 翻硬币问题描述问题链接:AcWing 1208. 翻硬币分析因为翻动两次相当于没有翻动,因此每个位置最多翻动一次,因此本题是一个确定性过程,从目标状态的第一个硬币开始考虑,如果不相同则翻动。因为保证有解,直接统计翻动次数,输出即可。代码C++#includ原创 2021-11-22 10:33:15 · 1899 阅读 · 0 评论 -
【算法专题】斐波那契数列
斐波那契数列本文会探讨斐波那契算法的各种六种求解算法。本文参考自:求解斐波那契数列的若干方法。斐波那契数列,通常用f(n)f(n)f(n)表示,该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。注意:这里不考虑整数溢出问题,一般来说标准题目如果数据过大会让我们对某个数取模。题目:Leetcode 0509 斐波那契数一. 递归分析递归存在大量冗余计算,时间复杂度是O(2n)O(2 ^ n)O(2n)的。代码C++class Solution原创 2021-04-19 21:08:08 · 356 阅读 · 0 评论 -
【算法专题】约瑟夫问题
约瑟夫问题这个问题是以弗拉维奥·约瑟夫命名的,他是1世纪的一名犹太历史学家。他在自己的日记中写道,他和他的40个战友被罗马军队包围在洞中。他们讨论是自杀还是被俘,最终决定自杀,并以抽签的方式决定谁杀掉谁。约瑟夫斯和另外一个人是最后两个留下的人。约瑟夫斯说服了那个人,他们将向罗马军队投降,不再自杀。约瑟夫斯把他的存活归因于运气或天意,他不知道是哪一个。 —— 【约瑟夫问题】维基百科本文会探讨约瑟夫问题的各种解法。参考网址:剑指 Offer 62 题解、约瑟夫环、今日头条2018春招研发岗笔试一原创 2021-05-30 21:51:42 · 705 阅读 · 1 评论 -
【算法专题】Morris遍历
Morris遍历Morris遍历可以在O(n)的时间,O(1)的空间内遍历一棵二叉树。Morris遍历可以分为前序、中序、后序遍历。参考网址:Morris遍历二叉树的定义C++struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};Javapublic class T原创 2021-07-16 11:13:48 · 285 阅读 · 0 评论 -
【算法专题】汉诺塔问题
汉诺塔问题有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子C上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动以及如何移动?一. 基本汉诺塔问题如何移动?这是一个递归问题。假设移动有n个圆盘,最终从A移动到C: 可以先将上面的n-1个圆盘移动到B,然后把最下面的圆盘移动到C,最后再把n-1根圆盘移动到C即可。具体代码如下:/** * 汉诺塔求具体方案 */publi原创 2021-09-05 16:14:01 · 497 阅读 · 0 评论 -
【算法专题】关键路径及代码实现
关键路径一. 问题描述概念一项工程计划可以被看成一个有向图,图中的顶点表示事件,边代表活动,边上的权值代表完成这项活动需要的时间,这样的有向图称为AOE网。表示实际工程计划的AOE网应该是无环的,在正常情况下存在唯一的开始顶点(源点)和唯一的完成顶点(汇点)。AOE网中的某些活动可以并行进行,完成工程的最短时间是从开始顶点到完成顶点的最长路径长度。路径长度最长的路径为关键路径。关键路径上所有活动都叫做关键活动。我们只有减少关键路径上活动用时才能加快工程的进度。我们的问题就是输原创 2021-09-07 11:19:58 · 13491 阅读 · 1 评论 -
【算法专题】环状图(置换群)
环状图(置换群)1 概念一个有向图如果有n个点,n条边,并且每个点的入度和出度都为1,这样的图被称为环状图。根据定义可知,环状图一定是由一定数量的环构成的。环状图一般和置换群的联系十分紧密,因为一个置换群对应一个环状图。2 例题AcWing 1224. 交换瓶子问题描述问题链接:AcWing 1224. 交换瓶子分析给定我们数组a,我们可以构造一个环状图,对于每个数据a[i],在图中连一条a[i]指向i的边。对于本题而言,对于样例1:3 1 2 5原创 2021-09-23 16:30:15 · 1387 阅读 · 0 评论 -
【算法专题】树的直径
树的直径定义:树中距离最远的两个点之间的距离被称为树的直径。1 做法做法一(1)任取一点作为起点x,找到距离该点最远的一个点y;(2)再找到距离y最远的一点z,那么y、z之间的路径就是一条直径。证明:核心是证明y一定是直径的一个端点。使用反证法证明,存在如下两种情况。假设y不是直径的一个端点。假设uv是直径。对于情况一:因为y是距离x最远的一个点,因此有ya + ax >= ua + ax,所以ya >= ua,所以yv >= uv,因此yv才是原创 2021-09-23 21:27:10 · 1565 阅读 · 0 评论 -
【算法专题】链表排序算法总结
链表排序算法总结概述问题描述:给定一个链表,请将这个链表升序排列。节点定义:struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {}};1 链表插入排序题目描述:Leetcode 0147 链表进行插入排序分析因为头结点可能会改变,因此需要设置一个虚拟头结点dummy。我们从前向后遍历整个链表,假设当前考察节点为p,我们需要从原创 2021-10-24 15:43:52 · 4952 阅读 · 0 评论 -
【算法专题】指数、排列、组合型枚举
指数、排列、组合型枚举递归常见的三类枚举方式是:指数型枚举、排列型枚举、组合型枚举。如下是三类题目的讲解以及对应实现。1. 指数型枚举AcWing 92. 递归实现指数型枚举问题描述问题链接:AcWing 92. 递归实现指数型枚举分析本题存在两种解法。解法一从前向后依次枚举每个数据选择与否。解法二使用一个二进制数据,对应位置为1,表示选择这个数据,否则不选这个数。代码C++// 解法一: 使用st数组表示每个数据选择与否#inclu原创 2021-10-29 14:19:33 · 680 阅读 · 0 评论 -
【算法专题】数独问题详解
数独问题详解1. 概述根据百度百科的描述:数独(shù dú)是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个九宫格内的数字均含1-9,不重复。下面给出数独问题的不同解法,从最简单的暴力开始,然后使用二进制进行优化,最后采用Dancing Links进行优化。下面给出三个题目:第一个题目使用最暴力的解法;第二个题目使用二进制优化;最后一个题目使用两种优化方式求原创 2021-10-29 16:22:39 · 5585 阅读 · 1 评论 -
【算法专题】重建二叉树
重建二叉树总结概述重建二叉树分为三种类型:(1)中序遍历+前序遍历/后序遍历 重建二叉树;(2)中序遍历+层序遍历 重建二叉树;(3)前序遍历+给定叶节点 重建二叉树。下面分别给出这三类重建二叉树的讲解。类型一:中序+前序/后序AcWing 1631. 后序遍历问题描述问题链接:AcWing 1631. 后序遍历分析对于给定前序遍历的区间[pl, pr]和中序遍历的区间[il, ir],则待构造的树的根节点为preorder[pl],原创 2021-11-01 11:03:57 · 3859 阅读 · 0 评论 -
【算法专题】Huffman树
Huffman树这里讲解哈夫曼树的基本问题,以及一个扩展问题。基本问题:每次合并两个数。扩展问题:每次合并k个数。AcWing 148. 合并果子问题描述问题链接:AcWing 148. 合并果子分析经典的哈夫曼树问题,每次合并两个最小的数值就可以得到最小的体力耗费值。代码C++#include <iostream>#include <queue>using namespace std;int n;int main(原创 2021-11-11 11:51:17 · 1037 阅读 · 0 评论 -
【算法专题】高精度之压位
高精度之压位当数据过大时,此时long long存储不下,因此需要使用vector或者数组存储,然后计算。一般vector或者数组中每个数据都是一个int,如果每个位置只是存储0~9一位数字的话,比较浪费空间,并且计算也会变慢。因此可以让每个位置存储连续的多位数字,这被称作压位。这里以压4位为例,也就是说:vector或者数组中每个位置存储四个连续的数字。1. 基本高精度运算关于基本高精度计算可以参考:高精度运算2. 高精度压位运算压位和不压位的高精度计算存在三点不同点(以下提到的压原创 2021-11-14 18:22:27 · 3395 阅读 · 1 评论 -
【算法专题】平面图形的面积并问题
平面图形的面积并问题1. 概述给定平面直角坐标系,坐标系中有若干图形,这些图形可以是三角形、多边形,圆形,甚至一些不规则的图形。这些图形可能会有重合的部分,我们在计算面积并的时候,重叠的部分只能计算一次。一般来说求面积并存在如下方法:(1)模拟(要求图形都是矩形,且矩形的四个顶点都在整点上),判断每个1x1的小矩形是否被至少一个图形覆盖一次,最后计算有多少小矩形被覆盖即可,对应例题:AcWing 3203. 画图;(2)扫描线,一般使用线段树实现(要求都是矩形,且矩形的边要和坐标轴原创 2021-11-16 16:22:16 · 950 阅读 · 0 评论 -
【算法专题】方格取数问题
方格取数问题1. 概述给定一个 n×mn \times mn×m 的矩阵,每个位置有个非负数,我们可以从左上角走到右下角,每经过一个位置我们可以把格子上对应的数字取走,取走之后数字变为0,问我们可以获得的数字之和最大是多少?此问题存在递进的三种类型:(1)可以从左上角走到右下角1次,对应题目:AcWing 1015. 摘花生;(2)可以从左上角走到右下角2次,对应题目:AcWing 1027. 方格取数、Leetcode 0741 摘樱桃;(3)可以从左上角走到右下角k次,对原创 2021-11-16 11:13:24 · 2818 阅读 · 0 评论 -
【算法专题】均分纸牌问题
均分纸牌问题1. 概述有n个小朋友,每个小朋友手中有一些糖果,每个小朋友都可以把他手中的糖果给相邻的小朋友,问使得所有小朋友手中糖果数量相同需要多少至少给多少次?或者至少传递多少糖果?存在两种类型:均分纸牌问题,即小朋友没有形成一个环,第一个小朋友只能给右侧小朋友,最右侧小朋友只能给左侧小朋友,对应例题:AcWing 1536. 均分纸牌;环形均分纸牌问题,小朋友形成一个环,每个小朋友都可以向左右小朋友给糖果,对应例题:AcWing 122. 糖果传递、AcWing 105. 七夕原创 2021-11-17 16:43:32 · 901 阅读 · 0 评论 -
【算法专题】坐标变换
坐标变换1. 概述这类题目一般使用递归解决,原问题转化为若干个子问题,根据子问题的解可以求出原问题的解。当问题牵涉到下标时,就需要使用坐标变化,有时候需要将原问题的坐标转化到子问题中,有时候需要将子问题的坐标转化为原问题的坐标。一般来说,如果题目让求解的就是坐标的话,需要根据子问题的坐标求解出原问题的坐标,例如:AcWing 98. 分形之城;如果求解的不是坐标的话,需要将原问题的坐标转化成子问题的坐标,例如:AcWing 631. Googol字符串。根据坐标的维度可以分为多种类原创 2021-11-17 20:32:04 · 2137 阅读 · 0 评论 -
【算法专题】平面点对距离问题
平面点对距离问题1. 概述平面上给定若干个点,让我们求解距离最远的两个点的距离,或者求解距离最近的两个点的距离,或者求解距离第k远的两个点的距离。朴素做法是算出任意两个点的距离,找到距离最大值或者距离最小值,或者距离第k大的值(可以借助快排),这样做的时间复杂度都是O(n2)O(n^2)O(n2)的,实际上这三类问题都存在 O(n×log(n))O(n \times log(n))O(n×log(n)) 的做法。(1)求距离最小值:AcWing 119. 袭击;(2)求距离最大值:原创 2021-11-18 15:08:57 · 1589 阅读 · 0 评论 -
【算法专题】卡特兰数
卡特兰数1. 概述卡特兰数:首先这个一个数,很多问题的结果都是卡特兰数,比如2016年全国三卷数学选择题压轴题让求解的就是卡特兰数,问题如下:首先是结论:卡特兰数为:C2nnn+1\frac{C_{2n} ^ n}{n+1}n+1C2nn因此,对于上面的题目,结果就是C2mmm+1=C844+1=705=14\frac{C_{2m} ^ m}{m+1} = \frac{C_8 ^ 4}{4+1} = \frac{70}{5} = 14m+1C2mm=4+1C84原创 2021-11-19 16:04:29 · 6891 阅读 · 0 评论 -
【算法专题】筛法求质数
筛法求质数1. 概述判断一个数n是否是质数,可以使用试除法,时间复杂度是O(n)O(\sqrt n)O(n)的。现在的问题是求1~n中的所有质数,如果一个一个判断的话,时间复杂度是O(n×n)O(n \times \sqrt n)O(n×n)的,不可取。筛质数所谓的筛质数是指:给定一个正整数n,输出1~n中的质数。存在三种筛质数的方法:(1)朴素法筛质数;(2)埃拉托色尼筛选法;(3)线性选法。这三种方法对数据的存储是相同的,如下:const int N =原创 2021-11-19 16:18:15 · 3240 阅读 · 1 评论