算法
一些和算法有关的题目
AkagiSenpai
哼 ~ 哼 啊啊啊啊啊啊啊啊啊
▃▆█▇▄▖
▟◤▖ ◥█▎
◢◤ ▐ ▐▉
▗◤ ▂ ▗▖ ▕█▎
◤ ▗▅▖◥▄ ▀◣ █▊
▐ ▕▎◥▖◣◤ ◢██
█◣ ◥▅█▀ ▐██◤
▐█▙▂ ◢██◤
◥██◣ ◢▄◤
▀██▅▇▀
展开
-
几种常见的背包问题 -- 分析及简单模板
目录前言01背包完全背包多重背包之 简单拆分多重背包之 二进制拆分混合背包二维费用的背包问题分组背包问题有依赖关系的背包问题前言今天复(yu)习背包问题。。。 其实之前背包问题,我也写过,但是属实写的太拉跨了,今天写一波重制版。。。背包算是一个经典的dp问题了。大概思路是这样:用一个体积为 V 的背包,选择一系列物品装进去。每个物品有他的价值 W问:在不超过背包最大体积的情况下,能够获取的物品最大价值是多少?01背包原题链接:https://www.acwing.com/problem/cont原创 2020-11-11 20:16:17 · 381 阅读 · 0 评论 -
SCC算法求强连通分量简单讲解证明及实现
目录强连通分量SCC算法简介两个概念dfs结束时间转置图SCC算法伪代码描述SCC算法正确性证明引理1:引理2:SCC证明不错找不漏找代码实现强连通分量连通分量要求任意两点可达,而强连通分量要求任意两点互相可达,即必须存在a->b且b->a的路径强连通分量问题就是求解一个图中所有的强连通分量集合。SCC算法简介SCC算法在《算法导论》中有介绍到,SCC算法基于dfs,通过两次dfs可以求出图中所有的连通分量,是快速的方法。在了解SCC算法之前先介绍两个概念两个概念dfs结束时间原创 2020-06-11 19:25:03 · 4821 阅读 · 2 评论 -
Edmonds-Karp算法(EK算法)简单讲解及实现(邻接表)
目录最大流问题介绍图定义源点与汇点最大流问题描述Ford-Fulkerson方法回退边与增广图伪代码图解Edmonds-Karp算法复杂度代码实现细节代码最大流问题介绍图定义给定一张有向图,a->b 边的权值表示当前情况下,从a到b能够发送的流量上限是多少,比如 a->b = 10 表示当前能够从a发10流量给b,当然我们也可以选择不发那么多。例子:假设a->b 之间未有任何流量的发送,此时我们发8流量,那么 a->b = 10 变为 a->b = 2 ,a->原创 2020-06-06 16:29:31 · 7396 阅读 · 4 评论 -
Tarjan算法求桥 思路+代码 无向图
目录几个定义桥深度优先数dfn直接父节点祖先子孙最小可达祖先Tarjan算法求解思路证明:伪代码图解代码几个定义桥桥是特殊的边,一个桥连接两个不同的连通分量,当一条边被去掉的时候,整个图的连通分量个数增加深度优先数dfndfn[] 即 depth first number ,深度优先数,dfn[x] 表示 x 号节点被访问的顺序,也就是dfs的顺序,如图,假设从左上角节点开始dfs,蓝色数字就是对应节点的dfn直接父节点如果dfs的其中一次递归有这样的顺序 A->B 那么A是B的直接原创 2020-05-27 19:30:02 · 2107 阅读 · 1 评论 -
最长相同子序列(LCS)问题时间与空间优化详解
问题描述给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。动态规划解法【最长上升子序列 O(n^2)普通解法】非常经典的d原创 2020-05-12 21:59:57 · 1866 阅读 · 0 评论 -
贪心法求解LIS(最长上升子序列)问题的证明
问题描述已知一个序列,要求它的最长上升子序列例子:[1,3,2,4,5,8,7]的一个子序列是 [1,4] ,[1] 也是一个子序列最长上升子序列,即序列中的元素成递增,比如 [1,2,4,5,7] 为上述例子的最长上升子序列贪心思路现在有序列 [1,3,2,3,5,8,7] ,在我们遍历前三个元素的时候,已知长度为 2 的子序列就有两个,分别是 [1,3] 和 [1,2] 当我们遍历到第四个元素(3)的时候,我们企图把3接在前面已知的最长子序列中(已知最长的长度是2),那么显然只能接在[1,2原创 2020-05-12 20:48:37 · 1038 阅读 · 2 评论 -
最近点对问题 分治法证明及两种分治法
问题描述对于平面上给定的N个点,给出所有点对的最短距离,即,输入是平面上的N个点,输出是N点中具有最短距离的两点。暴力法暴力法的思路相对简单,即枚举所有可能的配对情况,然后一一比对,找到距离最小的点,一共有 Cn2 种组合,也就是 n*(n-1)/2种,总的时间复杂度是O(n^2),因为时间开销过于昂贵,我们寻求别的方法分治法问题分割策略:排序,取中位数如果像快速排序,分割的策略与数据...原创 2020-04-28 19:11:21 · 2884 阅读 · 0 评论 -
活动安排问题贪心证明
问题描述已知一堆活动,他们有【开始时间】和【结束时间】,而同一时间你只能参加一个活动,如何选择参加活动的策略,尽可能地参加更多的活动?有几种贪心策略:贪开始最早贪持续最短贪结束最早先来看开始最早,很容易找到反例,如图贪开始最早,那么选择红色的活动,显然不是最优解,因为选择蓝色的活动,可以参加2次,而红色活动只能参加一次贪持续时间最短,显然也不对,特殊情况发生在最短时间的活动,...原创 2020-04-23 13:44:07 · 3477 阅读 · 1 评论 -
分数背包贪心策略证明
相比于01背包,分数背包的每件物品都可以分割,比如重量为10kg,价值70,那么可以分割为**单位重量(1kg)**的,价值为7的十个物品,这使得我们可以不必拘泥于背包的容量浪费,因为不管怎么搞你都可以把背包装满很容易想到,因为物体可以分割为原子(重量为1),那么评判物品的指标自然是【单位重量(1kg)物品的价值】了,这里用密度来形容这个属性贪心策略:尽可能地选择密度最大的物品直观证明:因...原创 2020-04-23 13:12:30 · 1708 阅读 · 0 评论 -
各种排序 模板 冒泡选择插入归并快排,递归+非递归 c++实现
之前做的算法实验,就直接放上来吧。。。。#include <iostream>#include <vector>#include <algorithm>#include <ctime>#include <cstdlib>#include <stack>using namespace std;/*funct...原创 2020-04-11 18:45:20 · 379 阅读 · 0 评论 -
凸包问题 分治法求解
问题介绍给定平面上一些点的集合,找到一些点,使得这些点形成一个凸的包围,围住所有的点,如图思路采用分治法,将点集合一分为二,整体的凸包问题可以分为【求上半部分的凸包】+【求下半部分的凸包】分策略将集合一分为二的策略是:将点按照x升序排序,x相同则按y升序,然后选取0和最后一个下标,以这两点做一条直线,这两点一定是最左边和最右边的,我们用 pa 和 pb 表示这两点为子问题求解划分范...原创 2020-04-03 14:43:20 · 7221 阅读 · 15 评论 -
01背包空间优化,完全背包时间优化 的图解
01背包空间优化当初学01背包的时候,会有这样一个状态转移方程:约定:dp[i][j]表示在0~i下标物品中选取,在总金额不超过j的情况下获得的最大价值v[i]表示第 i 下标的物品的价值dp[i][j] = max(dp[i-1][j], dp[i-1][j-v[i]]+v[i]);dp[i-1][j] 对应不选 【第 i 下标】 的物品dp[i-1][j-v[i]]+v[i]...原创 2020-03-30 22:39:04 · 2688 阅读 · 4 评论 -
ST表实现RMQ 动态规划思想
做题时如果要频繁查询一个区间的最大值或者最小值,是非常消耗时间的,但是预处理打st表(dp数组)的话,可以实现用常数时间查询区间最值ST表状态定义dp[i][j]表示以 i 下标为区间左端点,包含 2j 个元素的区间的最大元素的值即 dp[i][j] = 区间 [i, i+2^j-1] 的最大元素的值这么定义的好处是:对于一个区间左端点,我们花费O(log(n))的时间就可以列举出以它为左...原创 2020-03-29 15:13:57 · 207 阅读 · 0 评论 -
逆序对 归并排序求法 分治思想
逆序对介绍如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则<A[i], A[j]> 这个有序对称为 A 的一个逆序对,也称作逆序数。求解一个数组中逆序对个数其实就是求下标小的大数,那么二话不说先来暴力,暴力显然是O(n2),8太行int unseq(vector<int> &nums){ int...原创 2020-03-25 13:13:31 · 378 阅读 · 0 评论 -
蓝桥杯:试题 算法训练 采油区域 矩阵前缀和+动态规划+分治+枚举
资源限制时间限制:2.0s 内存限制:512.0MB采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井。被拍卖的整块土地为一个矩形区域,被划分为M×N个小块。Siruseri地质调查局有关于Navalur土地石油储量的估测数据。这些数据表示为M×N个非负整数,即对每一小块土地石油储量的估计值。为了避免出现垄断,政府规定每一个承包商只能...原创 2020-03-21 15:12:20 · 1000 阅读 · 2 评论 -
矩阵前缀和应用2:求解(x, y)左上方k*k区域的最大加和 动态规划
【矩阵前缀和:常数时间求一子矩阵的加和】如图,给定一点,要找到这点(包括)左上方的子区域内,使k*k区域所有数字加和最大的矩阵,如图 k=2对于x,y左上方的子矩阵中的某一k*k区域,这个区域只能有四种状态:k*k区域右边缘落在 (x, y) 正上方,问题转换为求解 (x-1, y) 左上方的最大加和的 k*k区域k*k区域下边缘落在 (x, y) 正左方,问题转化为求解 (x, y-...原创 2020-03-21 12:20:16 · 375 阅读 · 0 评论 -
矩阵前缀和应用1:最大和子矩阵 前缀和+动态规划
关于矩阵前缀和【矩阵前缀和:常数时间求一子矩阵的加和】给一个m*n的矩阵,找到一个子矩阵使其里面的数字加和最大,输出这个最大值首先想到暴力算法:枚举矩阵行列,复杂度O(n4),然后对每个枚举的子矩阵,计算矩阵内的加和O(n2),总复杂度O(n6)通过前缀和,可以把计算加和的时间变为O(1),总复杂度O(n4),还是有点大优化:引入动态规划中的最大子区间问题【类似的题目】已知一个一维数...原创 2020-03-20 15:43:22 · 383 阅读 · 0 评论 -
洛谷 P1282 多米诺骨牌 01背包
【传送门】题目描述多米诺骨牌有上下2个方块组成,每个方块中有1~6个点。现有排成行的上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|。例如在图8-1中,S1=6+1+1+1=9,S2=1+5+3+2=11,|S1-S2|=2。每个多米诺骨牌可以旋转180°,使得上下两个方块互换位置。 编程用最少的旋转次数使多米诺骨牌上下2行点数之差达到最小。对于图中的例子,...原创 2020-03-19 18:12:43 · 151 阅读 · 0 评论 -
UVA810 筛子难题 A Dicey Problem
【传送门】输入格式输出格式样例DICEMAZE13 3 1 2 5 1-1 2 45 5 66 -1 -1DICEMAZE24 7 2 6 3 66 4 6 0 2 6 41 2 -1 5 3 6 15 3 4 5 6 4 24 1 2 0 3 -1 6DICEMAZE33 3 1 1 2 42 2 34 5 6-1 -1 -1END输出DICE...原创 2020-03-16 00:30:27 · 215 阅读 · 0 评论 -
UVA806 空间结构 Spatial Structures 搜索
题目传送门题意翻译一个四分树是由一个方格的结构组成的,如图:(就是上面的三个图)。那些像素点可以构成一个四分树,如图:(就是上面的那个树)。我们规定,NW=1,NE=2,SW=3,SE=4,而一个节点所构成的数字串可以认为是一个五进制数,将它们排序后输出。例如:上图中地四号节点的路径为NE,SW,所以是32(5进制) = 17(十进制)那么上树所对应的一传数列为:(在十进制下)9 ...原创 2020-03-15 17:37:41 · 284 阅读 · 0 评论 -
LeecCode:135 分糖果 贪心
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻的孩子中,评分高的孩子必须获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?示例 1:输入: [1,0,2]输出: 5解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。示例 2:输...原创 2020-03-06 18:15:11 · 313 阅读 · 0 评论 -
LeetCode:310 最小高度树 反向bfs
对于一个具有树特征的无向图,我们可选择任何一个节点作为根。图因此可以成为树,在所有可能的树中,具有最小高度的树被称为最小高度树。给出这样的一个图,写出一个函数找到所有的最小高度树并返回他们的根节点。格式该图包含 n 个节点,标记为 0 到 n - 1。给定数字 n 和一个无向边 edges 列表(每一个边都是一对标签)。你可以假设没有重复的边会出现在 edges 中。由于所有的边都是无向边,...原创 2020-03-05 18:28:57 · 258 阅读 · 0 评论 -
LeetCode:126 单词接龙 II BFS+DFS+剪枝
给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则:每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回一个空列表。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 beginW...原创 2020-03-04 22:43:47 · 332 阅读 · 0 评论 -
LeetCode:239 滑动窗口最大值 双端队列 O(n)
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7]解释:提示:你可以假设 k 总是有效的,在输入数组不为空的情况下,1 ≤ k ≤ 输入数...原创 2020-03-02 11:39:23 · 218 阅读 · 0 评论 -
蓝桥杯:方格分割 特别的dfs思路 以及一些dfs的总结
题目描述6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。如图就是三种合法的分割:试计算:包括这3种分法在内,一共有多少种不同的分割方法。注意:旋转对称的属于同一种分割法。请提交该整数,不要填写任何多余的内容或说明文字。思路这题一开始我是想暴力列举18个点,然后判断,发现时间复杂度太高然后我又想对格子dfs,发现dfs无法做到那种有分叉的,弯曲的形状,遂放弃后...原创 2020-02-29 16:30:07 · 319 阅读 · 0 评论 -
LeetCode:3 无重复字符的最长子串 哈希表+双指针 O(n)
题目描述给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “w...原创 2020-02-25 15:08:17 · 162 阅读 · 0 评论 -
LeetCode:877 石子游戏 动态规划 / 巧取
题目描述亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] 。游戏以谁手中的石子最多来决出胜负。石子的总数是奇数,所以没有平局。亚历克斯和李轮流进行,亚历克斯先开始。 每回合,玩家从行的开始或结束处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止,此时手中石子最多的玩家获胜。假设亚历克斯和李都发挥出最佳水平,当亚历克斯赢得比赛时返回 true ...原创 2020-02-24 16:36:52 · 440 阅读 · 0 评论 -
LeetCode:18 四数之和
题目描述给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。注意:答案中不可以包含重复的四元组。示例:给定数组 nums = [1, 0, -1, 0, -2, 2] 和 target = 0。满足要求的四元组集合为:...原创 2020-02-23 17:22:14 · 117 阅读 · 0 评论 -
LeetCode:15 三数之和 双指针与去重技巧
题目描述给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。示例:给定数组 nums =[-1, 0, 1, 2, -1, -4]满足要求的三元组集合为:[ [-1, 0, 1], [-1, -1, 2]]来源:力扣(Le...原创 2020-02-23 16:00:01 · 391 阅读 · 0 评论 -
LeetCode:312 戳气球 动态规划
题目描述有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。现在要求你戳破所有的气球。每当你戳破一个气球 i 时,你可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注意当你戳破了气球 i 后,气球 left 和气球 right 就变成了相邻的...原创 2020-02-22 22:47:03 · 269 阅读 · 0 评论 -
LeetCode:154 寻找旋转排序数组最小值II 二分搜索
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。注意数组中可能存在重复的元素。示例 1:输入: [1,3,5]输出: 1示例 2:输入: [2,2,2,0,1]输出: 0说明:这道题是 寻找旋转排序数组中的最小值 的延伸题目。允许重复会影响算法的时间复杂度...原创 2020-02-21 16:05:47 · 119 阅读 · 0 评论 -
常用的二分搜索模板及lower/upper_bound实现
常用的二分搜索模板及lower/upper_bound实现【关于lower/upper_bound库函数】约定待查找数组nums是有序或者部分有序数组按照升序排序待查找区间是 [l, r],区间中点值 mid=l+(r-l)/2类型1:收缩区间不根据左右邻居这是一种常见的查找方式,通过比较中点下标mid元素与目标元素的大小关系,来决定收缩左边界还是右边界查找条件可以在不与元素的两...原创 2020-02-21 00:34:57 · 280 阅读 · 0 评论 -
LeetCode:162 寻找峰值 二分搜索
【上一篇分治法,递归,O(log(n))】峰值元素是指其值大于左右相邻值的元素。给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。你可以假设 nums[-1] = nums[n] = -∞。示例 1:输入: nums = [1,2,3,1]输出: 2解释: 3 是峰值...原创 2020-02-20 17:41:29 · 152 阅读 · 0 评论 -
LeetCode:162 寻找峰值 分治法
题目描述峰值元素是指其值大于左右相邻值的元素。给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。你可以假设 nums[-1] = nums[n] = -∞。示例 1:输入: nums = [1,2,3,1]输出: 2解释: 3 是峰值元素,你的函数应该返回其索引 2。...原创 2020-02-20 17:11:55 · 428 阅读 · 1 评论 -
二分查找的一般形态及左右逼近变式(LeetCode:34)
二分查找对于有序的数组是十分好用的查找方法,其使用分治法,将数组一分为二,每次排除一半的元素,复杂度是O(log(n))一般形态:数组中没有重复元素【更为详细的版本】将数组分为左边一坨 中间元素 右边一坨0~mid-1 mid mid+1~end如果中间元素是目标,找到如果中间元素小于目标,在右边一坨找如果中间元素大于目标,在左边一坨找vector<int>...原创 2020-02-20 16:29:17 · 583 阅读 · 1 评论 -
LeetCode:33 搜索旋转排序数组 递归+二分
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6,7,0,1,2], targ...原创 2020-02-19 16:55:39 · 142 阅读 · 0 评论 -
二分查找,平方根及越界处理
思路求一个数的平方根,可以用牛顿迭代法,也可以直接梯度下降 ,也可以用二分搜索n的根号一定是实数,实数是有序递增的,区间有序因为n的根号肯定介于0 ~ n之间,区间上下界确定每次可以比较大小 (sqrt*sqrt > n ?),区间递推关系确定自然让我们想到用二分的方法求解我们确定区间上下限:l, r l=0, r=n,区间中点mid就是我们要查找的值,mid=(l+r)/2...原创 2020-02-19 15:45:47 · 775 阅读 · 0 评论 -
LeetCode:127 单词接龙 哈希set+BFS 与双端BFS优化
LeetCode:127 单词接龙 哈希set+BFS 与双端BFS优化【附:图BFS的做法,时间复杂度高】题目描述给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回 0。所有...原创 2020-02-16 20:09:47 · 265 阅读 · 0 评论 -
LeetCode:127 单词接龙 无向图BFS
LeetCode:127 单词接龙 无向图BFS给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回 0。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词...原创 2020-02-16 17:38:48 · 143 阅读 · 0 评论 -
LeetCode:53 最大子序列 区间DP
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。来源:力扣(LeetCode) 链接:https://leetcode-...原创 2020-02-15 19:20:34 · 673 阅读 · 0 评论