算法
文章平均质量分 51
一只老风铃
欣于所遇,暂得于己,快然自足。
展开
-
状态DP:二进制状态与图的搜索
问题引入描述城市里有n个郊区和m条无向道路,第i条道路连接郊区Ai和Bi,路费是Ci。决定去其中的R个郊区,需要找到一条路线使得他们的花费最少,假设他们制定的旅游路线为V1, V2 ,V3 … VR,那么他们的总花费为从V1到V2的花费加上V2到V3的花费依次类推输入描述:第一行三个整数n, m, R(2 ≤ n ≤ 200, 1 ≤ m ≤ 5000, 2 ≤ R ≤ min(n, 15))。第二行R个整数表示需要去玩耍的郊区编号。以下m行每行Ai, Bi, Ci(1 ≤ Ai, Bi原创 2021-12-11 15:54:39 · 394 阅读 · 0 评论 -
树形DP:配对染色
问题引入描述给定一棵树,为每个顶点染成红色或蓝色。要求:每个红点周围有且仅有一个红点,每个蓝点周围有且仅有一个蓝点。“周围”的定义:某点周围的点指通过邻边直接连接的点。所谓树,即没有自环、重边和回路的无向连通图。输入描述:第一行一个正整数 n,代表树的顶点个数.。接下来的 n-1 行,每行两个正整数 u 和 v,代表点 u 和点 v 有一条边连接。保证输入的一定是一棵合法的树。输出描述:如果可以达成染色的要求,请输出一个长度为 n 的字符串,第 i个字符代表第 i个顶原创 2021-12-09 22:25:17 · 1578 阅读 · 0 评论 -
树形DP:树的最大独立集
最大独立集树的最大独立集,即树中最多的不相邻的点的集合问题引入描述Cwbc和XHRlyb生活在 s 市,这天他们打算一起出去旅游。旅行地图上有 n 个城市,它们之间通过 n-1 条道路联通。Cwbc和XHRlyb第一天会在 s 市住宿,并游览与它距离不超过 1 的所有城市,之后的每天会选择一个城市住宿,然后游览与它距离不超过 1 的所有城市。他们不想住在一个已经浏览过的城市,又想尽可能多的延长旅行时间。XHRlyb想知道她与Cwbc最多能度过多少天的时光?输入描述:第一行,两原创 2021-12-09 00:14:28 · 534 阅读 · 0 评论 -
取余dp:配整
描述一个数组,取一些数使得取的数之和尽可能大,但要求这个和必须是 的倍数。输入描述:第一行输入两个正整数 n 和 k第二行输入 n 个正整数输出描述:如果没有合法方案,输出 -1。否则输出最大的和。示例1输入:5 54 8 2 9 1输出:20说明:取后四个数即可思路问题要求在一个数组中,选取一定数字组配成能够被k整除最大的和,若采取基本做法,那么需要计算每个数字是否加入到Sum中,并求和,复杂度为指数级别采取动态规划dp[n][i]=k 表示前原创 2021-12-07 22:29:54 · 1088 阅读 · 0 评论 -
二维差分-记录边缘变化
描述给你一个n行m列的矩阵,下标从1开始。接下来有q次操作,每次操作输入5个参数x1, y1, x2, y2, k表示把以(x1, y1)为左上角,(x2,y2)为右下角的子矩阵的每个元素都加上k,请输出操作后的矩阵。输入描述:第一行包含三个整数n,m,q$.接下来n行,每行m个整数,代表矩阵的元素接下来q行,每行5个整数x1, y1, x2, y2, k,分别代表这次操作的参数1≤n,m≤10001≤q≤10n1≤x1≤x2≤nm1≤y1≤y2≤m输出描述:输出n行,原创 2021-12-07 20:13:04 · 598 阅读 · 0 评论 -
同时推进-二叉树对称性判断
问题描述给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)例如:下面这棵二叉树是对称的1/ 2 2/ \ / 3 4 4 3下面这棵二叉树不对称。1/ 2 2\ 3 3备注:用递归和迭代两种方法解决这个问题非递归思路对于前序遍历:根节点=》左子树=》右子树若需要判断对称性,那么可以修改前序遍历的方式,即:①根节点=》左子树=》右子树②根节点=》右子树=》左子树①和②采取非递归的方式同步推进,研究中间每个节点是否对称原创 2021-06-09 11:45:54 · 110 阅读 · 0 评论 -
区间+二分:求解最值
二分思想当可以确认所求的问题的解,一定位于一个有序区间内,并且满足区间前面部分满足要求,区间后面部分不满足要求,那么可以采取二分的思想进行对数级别复杂度的求解定位。题目描述一个长度为n的正整数序列,从里面取出一段连续的长度大于等于k的序列。定义一个序列的“中数”为最大的整数x,满足序列中至少一半的数字大于等于x从中任取序列的,若存在中数,最大中数可以是多少?示例1输入5,3,[30,1,2,31,9]返回值30说明选前四个数字组成[30,1,2,31],中数为30求原创 2021-03-16 12:07:17 · 298 阅读 · 0 评论 -
贪心算法:平均
题目描述有三只球队,每只球队编号分别为球队1,球队2,球队3,这三只球队一共需要进行 n 场比赛。现在已经踢完了k场比赛,每场比赛不能打平,踢赢一场比赛得一分,输了不得分不减分。已知球队1和球队2的比分相差d1分,球队2和球队3的比分相差d2分,每场比赛可以任意选择两只队伍进行。求如果打完最后的 (n-k) 场比赛,有没有可能三只球队的分数打平。输入描述:第一行包含一个数字 t (1 <= t <= 10)接下来的t行每行包括四个数字 n, k, d1, d2(1 <= n原创 2021-03-12 09:52:12 · 230 阅读 · 0 评论 -
集合划分问题-DFS与回溯
集合划分问题集合划分问题是对这样一类问题的抽象,即原始问题包含一些列可能结果,不断的划分出子集并研究剩余的集合能否继续划分,即问题能否最终求解,通常采取dfs进行求解题目描述一种卡牌游戏,规则如下:总共有36张牌,每张牌是1~9。每个数字4张牌。你手里有其中的14张牌,如果这14张牌满足如下条件,即算作和牌14张牌中有2张相同数字的牌,称为雀头。除去上述2张牌,剩下12张牌可以组成4个顺子或刻子。顺子的意思是递增的连续3个数字牌(例如234,567等),刻子的意思是相同数字的3个数字牌(原创 2021-03-06 12:47:59 · 391 阅读 · 0 评论 -
单源最短路径算法
对于单源最短路径算法,最为著名的为基于贪心策略的dijkstra,其维护一个从开始点到所有点的Dis[]数组,每次选取剩余点中距离源点最短的点,加入到已访问集合U中,同时更新源点到剩余点集合V中的点的Dis[]数组。题目描述在一个有向无环图中,已知每条边长,求出1到n的最短路径,返回1到n的最短路径值。如果1无法到n,输出-1输入5,5,[[1,2,2],[1,4,5],[2,3,3],[3,5,4],[4,5,5]]输出9核心公式: dis[index]+map[index][.原创 2021-03-01 05:10:28 · 928 阅读 · 0 评论 -
Manacher算法:避免从1开始
问题引出给定一个字符串str, 返回str中最长回文子串的长度str=“123”。其中的最长回文子串“1”或者“2”或者“3”,所以返回1。str=“abc1234321ab”。其中的最长回文子串“1234321”,所以返回7。如果str的长度为N,解决原问题的时间复杂度都达到O(N).输入描述:输入为一个字符串str输出描述:输出一个整数表示最长回文子串的长度此类问题与KMP算法类似,都是字符串匹配算法,KMP算法利用模式串的next数组,避免重复计算,其核心思想是:当匹配失原创 2020-12-04 02:16:10 · 159 阅读 · 0 评论 -
Leetcode 堆排序
堆是完全二叉树,即对于一个节点k 其孩子节点为2k+1 2k+2 (存在孩子节点情况下) 满足任意一个节点值大于(或小于)其孩子节点值,在建立和调整堆的过程包含两大操作:shift_up:向上调整,通常用于末尾添加一个新节点后,向上方向移动若干个位置,即不断判断其父亲节点是否更小,若是:交换 shift_down:向下调整,当根节点删除后,需要在根节点补充一个(通常是末尾),该元素需要下沉到合适位置,基本策略是:若当前节点比左右孩子节点都大,无需调整。 否则,找到孩子节点的最大值,与当前...原创 2020-10-02 10:01:21 · 554 阅读 · 0 评论 -
关于约瑟夫环的递归思路
有n个人,编号为1~n,从第一个人开始报数,从1开始报,报到m的人会死掉,然后从第m+1个人开始,重复以上过程。在死了n-1个人后,问最后一个人的编号是?解法一模拟:采取一个dead[]数组,每次从一个没有死的人开始,活着的人依次报数(那么需要跳过dead[i]==true的人),到m处那个人去世同时计数num++ 当杀死num==n-1时,返回dead[]数组中为false的人下标+1易错点(下标)解法二递归:将n个人排开,第m个人奖去世=》子问...原创 2020-09-17 23:03:46 · 350 阅读 · 0 评论 -
二分图的最大匹配-解决匹配问题
题目描述题目描述若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的N(N为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案多种多样,例如有4个正整数:2,5,6,13,如果将5和6分为一组中只能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会希望你寻找出“最佳方案”。输入:有一个正偶数N(N≤100),表示待挑选的自然数的原创 2020-09-11 15:33:12 · 891 阅读 · 0 评论 -
动态规划 分类01背包问题
题目描述物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:主件 附件 电脑 打印机,扫描仪 书柜 图书 书桌 台灯,文具 工作椅 无 如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有0个、1个或2个附件。附件不再有从属于自己的附件。每件物品规定了一个重要度,分为5等:用整数1~5表示,第5等最重要。在不超过N元(可以等于N元)的前提下,使每件物品的价格与重...原创 2020-09-07 12:04:03 · 651 阅读 · 0 评论 -
算法 DFS
题目描述题面n-1n−1条道路连通的nn座城市,城市两两之间有且只有一条路径,每条都道路都有一个权值ww。现在城市之间要建立通讯网络,两座城市之间通讯质量取决于链路所经路径的权值和,权值和越大则链路的通讯质量越高。一条路径被破坏后,经过这条路径的所有通讯线路均被破坏。牛牛想知道哪条道路一旦被破坏,对整个城市通讯网络的影响最大。输入第一行一个正整数nn。接...原创 2020-04-23 11:53:27 · 513 阅读 · 0 评论 -
动态规划 最大乘积
【问题描述】Given a rope whose length is n(n is an integer), please cut the rope to m parts(each part’s length is an integer) to get the maximum product of the length of each part Ql1+l2+..+lm=n l1 ∗ ...原创 2020-01-08 20:11:46 · 996 阅读 · 0 评论 -
动态规划 二叉树选点
【问题描述】You are given a binary tree, and each node in the tree has a positive integer weight. If you select a node, then its children and parent nodes cannot be selected. Your task is to fifind a se...原创 2020-01-08 19:21:44 · 321 阅读 · 0 评论 -
动态规划 01背包拓展
【问题描述】There is a server which has the disk space ofMand the memory ofN. Given some tasks, thei-th task needs the disk space ofXiand the memory ofYi, and it can serveUiusers. Design an algor...原创 2020-01-06 20:18:14 · 217 阅读 · 0 评论 -
动态规划 金币配置
【问题描述】给定一系列的整数金额的硬币(数量足够),给定一个金额N,问有多少种组配方案?例如,面值为1和面值为2的硬币,组配金额4,方案如下:1 1 1 1 2 1 1 2 2共三种方案。【求解思路】将所有硬币按照面值大小从小到大排列,假设有m种不同面值的硬币,那么最终组配方案可以分为m类:使用前1种硬币组配方案 使用前2种硬币组配方案 使用前3种硬币组配方案 ...原创 2020-01-06 18:03:39 · 545 阅读 · 0 评论 -
动态规划 二叉搜索树的种类
【问题描述】给定从1到n的n个编号的节点,问这些节点可以构成多少种不同的二叉搜索树?当n=1时,只有1种当n=2时候,有2种以1为根节点 以2为根节点当n=3时,有3大类,共5种以1为根节点 以2为根节点 以3为根节点【求解思路】对于1到n个节点,其最终的二叉搜索树的种类可以分为n大类;即以1为根节点以2为根节点以3为根节点........原创 2020-01-06 15:36:25 · 672 阅读 · 0 评论 -
分治算法 凸多边形的划分
【问题描述】给定一个n边形,可以用不交叉的直线将多边形划分成多个三角形,给多边形顶点从1到n编号,问有多少种划分方法?显然;当n=3时,有一种划分方法当n=4时,有两种划分方法当n=5时,有5种划分方法........【求解思路】仅仅考虑和两点连成的边,那么在最终的划分中必定属于一个划分三角形的2个顶点。依据第三个顶点进行分类讨论:若第三个顶点为 ...原创 2020-01-05 20:25:56 · 1242 阅读 · 0 评论 -
线性规划 原问题与对偶问题
在线性规划中,通过对原目标函数引入拉格朗日乘项,转化为求解对应新函数的优化问题原创 2019-12-15 21:16:54 · 4347 阅读 · 0 评论 -
线性规划 单纯形算法实现
【问题描述】DescriptionSuppose you will recruit a group of volunteers for a coming event. It is estimated that this event will take N days to complete, and the i(th) day needs at least Ai volunteers. Th...原创 2019-12-16 21:21:26 · 480 阅读 · 2 评论 -
线性规划 单纯形算法实例
例:解最优化问题:min -x1-x22x1+x2<=12 x1+2x2<=9 Xi>0 ,i=1,2,3,4【1】改写成标准形式,引入松弛变量2x1+x2+x3=12 x1+2x2+x4=9 Xi>0,i=1,2,3,4列出单纯形表: X1 X2 X3 X4 b X3 2 1...原创 2019-12-13 21:27:38 · 620 阅读 · 0 评论 -
动态规划 多重01背包及空间开销优化
先考虑传统01背包问题:给定N个物品的权重和价值,如何选择部分物品放入最大容量W的背包中,以获得最大总值?其转移方程是: dp[i][j]表示前i件物品选择一些装入j容量包能获取的最大价值那么 dp[i][j]=max{ dp[i-1][j],dp[i-1][j-w[i]]+value[i] }也就是考虑第i件物品放入或者不放入背包,这两者中取最大值如何填充这个dp数组? 依次...原创 2019-12-03 11:50:50 · 351 阅读 · 0 评论 -
快速排序 寻找第K大的数
对于海量不确定数据,可采用维护大小为K的最小堆不断更新前K大的数但对于数量有限的数组,可采用快速排序的思想寻找第K大的数,时间复杂度为O(lgN)即快排之后,若K刚好为基准点下标,那么返回基准点处的值若K小于基准点,那么在前部分序列中递归查找若K大于基准点,那么在后部分序列中递归查找int Partition(int low, int high, int a[]){ ...原创 2019-09-15 10:34:18 · 1716 阅读 · 0 评论 -
归并排序 求解显著逆序对
求解逆序对,可以采取归并排序的方法即当前半部分a[i]大于后半部分a[j]时,结果res+=m-i+1(其中m-i+1表示前半部分a[i]及其之后所有元素与a[j]构成逆序对)显著逆序对 a[i]>3a[j+1]具体思路,当a[i]>a[j]时进一步从此开始向后寻找到一个a[k]>3a[j]那么res+=m-k+1;注意可能出现a[j]<a[...原创 2019-09-15 14:02:17 · 294 阅读 · 0 评论 -
排序 求解数组的逆序对
数组中,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给定一个数组,求出这个数组中的逆序对的总数。传统思路:每遇到一个数字,遍历其后数字比该数字小的组成一组逆序对,复杂度O(N2)进阶思路:归并排序中,如果遇到前部分序列的一个值A,比后部分序列一个值B小的 说明前部分序列从A开始的每一个数字(因为每部分序列内部是已经升序的),都可以与B组成逆序对 前部分序列...原创 2019-03-16 13:29:20 · 329 阅读 · 0 评论 -
二叉树 层次遍历
给定一颗二叉树,依次从根节点一层一层返回节点基本思路:利用队列模拟这一过程根节点入队列取队列头节点若该节点还有左右节点 入队列之道队列为空二叉树结构struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : ...原创 2019-02-17 11:20:28 · 175 阅读 · 0 评论 -
算法 海量数据中第K大的数
针对大量数据,并且数据还在不断增长的情况,返回第K大的数(如排行榜维护)思路,采取最小堆,初始化堆放入K个元素,之后每来一个数,若数比堆顶元素大,则删除堆顶元素,并替换新的数否则,不做操作#include <iostream>#include<queue>using namespace std;int main(){ priority_queue...原创 2019-09-10 14:28:24 · 468 阅读 · 0 评论 -
算法 图的最小生成树算法
最小生成树的Kruskal算法采取贪心策略即将图的各条边按照权值大小排序,依次从最小的边开始加入最小生成树但是加入前需要确认加入的边不会使得原先构成环基本思路:初始化每个顶点为单独一个集合,每加入一条边后,合并边所在的2个顶点所属集合每次加入边时需要确认边2边所属顶点集合不同采取并查集实现集合合并与快速查询,采取路径压缩加速并查集void UFSet()//初始化{...原创 2019-09-07 11:31:36 · 292 阅读 · 0 评论 -
算法 并查集与路径压缩
问题描述: 给定武林中人的数目,以及一组关系 若a与b有关系,那么a b属于同一帮派,关系可以传递 问这群人中总共组合成多少个帮派?思路: 并查集经典应用: 通过,查询,合并等操作 实现细节: 初始化一个人一个帮派,每合并一次 sum--案例输入: 10 9 1 2 1 3 1 4 1 ...原创 2019-09-05 10:57:59 · 285 阅读 · 0 评论 -
算法 不用+ - * /计算2个数的和
求两个整数之和,不使用+、-、*、/四则运算符号。思路:换算成二进制,两个二进制相加 为对应的按位异或 进位为对应的按位与运算 不断重复直到进位为05+7=12第一步:相加各位的值,不算进位,得到2。 第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。计算二进制值相加: 5-101,7-111 第一步:相加各位的值,不算进位...原创 2019-02-28 21:04:28 · 449 阅读 · 0 评论 -
算法 把数组排成最小的数
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路:对于2个数字如 3 31 先将其转成字符串 拼接 直接比较字符串大小 313<331 所以 31排在3前面static bool fun(int a,int b) { ...原创 2019-02-23 19:39:29 · 173 阅读 · 0 评论 -
字符串 通配符匹配
问题描述:通配符匹配通配符 ? 表示可以替换一个任意字符 通配符 * 表示可以替换一个 长度任意的字符串 或者替换空a*b? 可以匹配: acdbfdbf abc 现给定通配字符串s1 判断s2 是否满足匹配思路:采用动态规划 dp[i][j]表示S1前i长度部分与S2前j部分是否匹配对于dp[i][j]——s1[i]为*表示,该处可以为任意字符串 ...原创 2019-02-27 15:52:27 · 5497 阅读 · 0 评论 -
算法 最大连续子序列的和
给一个数组,返回它的最大连续子序列的和。{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。O(n)时间复杂度的简洁解法class Solution {public: int FindGreatestSumOfSubArray(vector<int> array) { ...原创 2019-02-17 12:36:55 · 389 阅读 · 0 评论 -
算法 浮点数的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。思路 分为2大类 exponent小于0 exponent大于0 进一步细分exponent为奇数或偶数 采用递归下降计算法 fun(base,exponent)=fun(base,exponent>>1) 采用右移代替除2 另外分类...原创 2019-02-17 11:30:24 · 826 阅读 · 0 评论 -
数组 数组中超过一半的数字
问题描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路:对数组进行排序取数组的中位数(size/2处)若该数与第一个数字或最后一个数相等那么找到了该数否则不存在 返回0 class Solutio...原创 2019-02-17 11:24:34 · 281 阅读 · 0 评论 -
二叉树 判断一颗二叉树是否是另一颗树的子结构
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 思路:1 判断A B根节点是否相等,若相等,判断A B左右子树是否是 父子结构关系 若都成立 返回true2 若不相等,那么递归到A的左右子树 判断B是不是A的子树的子结构 树结构: truct Tree...原创 2019-02-17 11:11:22 · 754 阅读 · 1 评论