
algorithms
文章平均质量分 63
分享学习算法的一些笔记
Melody_Gogo
你野心勃勃,灵魂有火。
展开
-
DFS【Acwing】
【DFS】1. 排列数字 2. n-皇后原创 2022-07-04 10:49:35 · 249 阅读 · 1 评论 -
【力扣】最小基因变化
题目链接:https://leetcode-cn.com/problems/minimum-genetic-mutation/// start-end 每一次有效的基因变化后的基因序列 都是start->end的一个状态//最短编辑距离的问题 抽象为边权为1的图上的最短路问题 使用BFS求解//bank中的状态可以看作是图上的节点,因为需要保证 每次变化后的状态都在bank中//两个状态如果只相差一个字符,说明这两个节点是相邻的//从start出发,BFS逐层遍历图上的每一个节点,为了方原创 2022-05-07 22:56:29 · 205 阅读 · 0 评论 -
取快递【球盒模型】【同球同盒】
题目描述双十一很多商品属实便宜,小明也是没控制住自己,于是这周他手机上的快递短信就爆炸了。在兴奋的同时,如何把这些快递取回来就是一件比较麻烦的事了。目前,小明有mmm个快递需要取,但是他计划至多跑nnn次就将所有的快递取回来,并且绝对不拖延的小明还要保证每次取的快递数不少于之后每次取的快递数。但是纠结的小明就在想,一共有多少种不同的取快递方式。不过为了减少纠结,他决定只考虑每次取的快递数,也就是假设所有快递都是完全相同的。输入两个正整数mmm和nnn,分别表示快递总数和计划最多几次取完快递。原创 2021-12-28 15:17:14 · 992 阅读 · 0 评论 -
DFS【模板】
#include<bits/stdc++.h>#include<iostream>using namespace std;vector<int> vec[1000];bool isVisited[1000];int num[1000];//计算节点数void dfs(int index){ cout<<index<<" "; //从index点开始访问 num[index]=1; for(int i=原创 2021-12-27 22:12:40 · 454 阅读 · 0 评论 -
确实是凉菜【类似砍木头】【二分】
题目描述乾隆白菜是北京的特色美食,它的做法是用麻酱为基调的酸甜料汁,凉拌生白菜心,做法简单,清脆爽口,确实是一道凉菜。于是,小明决定自己做一份“精品”的乾隆白菜。首先,他准备了nnn颗重量都是整数的精品白菜叶作为食材。接下来,他需要将这些白菜叶撕成至少mmm片来完成这道菜,有强迫症的小明为了让这道菜更加精品,他要求每片菜叶的重量相同,且必须也是整数。强迫症是可怕的,为了不让这道菜毁为白菜碎,小明还要保证每片白菜叶的重量尽可能大。那么请问,成菜中每片白菜的最大重量会是多少?输入第一行两个整数n原创 2021-12-27 10:53:59 · 447 阅读 · 0 评论 -
快速排序【分治】【随机】
#include <bits/stdc++.h>using namespace std;int arr[100010];void quicksort(int left, int right){ //递归终止条件 if(left>=right) return; //选择一个基准pivot,然后将<pivot的放到左边,将>pivot的放在右边,最后将pivot与中间相遇的交换。 //这个过程不断递归,直到区间为1,完成排原创 2021-12-26 16:14:56 · 675 阅读 · 0 评论 -
最长公共子序列【线性DP】【二维】
给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。示例 1:输入:text1 = “abcde”, text2 = “ace原创 2021-12-21 22:47:03 · 144 阅读 · 0 评论 -
最长回文子序列【线性DP】【二维】
Desciption:给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。示例 1:输入:s = “bbbab”输出:4解释:一个可能的最长回文子序列为 “bbbb” 。示例 2:输入:s = “cbbd”输出:2解释:一个可能的最长回文子序列为 “bb” 。提示:1 <= s.length <= 1000s仅由小写英文字母组成题目链接:https://le原创 2021-12-21 22:07:20 · 165 阅读 · 0 评论 -
二分查找【仅代码】【左右界】
#include <bits/stdc++.h>using namespace std;int ans[1010];//寻找左边界//如果找到target则返回最小下标,否则返回<target的最大的数的下标//寻找等于的时候收敛到的=target的最小下标//否则收敛到大于target的z最小数的下标int findLeft(int target, int left, int right){ int mid; while(left<right){原创 2021-12-21 14:03:16 · 334 阅读 · 0 评论 -
最长上升子序列【线性DP】【一维】【二分】
Desciption:给定一个长度为 NN 的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式第一行包含整数 NN。第二行包含 NN 个整数,表示完整序列。输出格式输出一个整数,表示最大长度。数据范围1≤N≤1000,1\leq{N}\leq1000,1≤N≤1000,−109≤-10^9\leq−109≤数列中的数≤109\leq{10^9}≤109。输入样例:73 1 2 1 8 5 6输出样例:4Answer:解法一:动态规划 O(n2)O(n^2)O原创 2021-12-20 20:13:29 · 379 阅读 · 0 评论 -
爬楼梯问题【线性DP】【一维】【矩阵快速幂】
两个爬楼梯的题,一个2*2, 一个是3*3。Description: 爬楼梯游戏题目来源:https://www.acwing.com/problem/content/description/3683/一个楼梯共有nnn级台阶,每次可以走一级或者两级,问从第000级台阶走到第nnn级台阶一共有多少种方案。输入格式一个整数nnn。输出格式一个整数,表示方案总数。由于结果很大,因此只需输出对100000000710000000071000000007取模后的值。数据范围1≤n≤10181\l原创 2021-12-20 16:30:24 · 716 阅读 · 0 评论 -
数字三角形【线性DP】【二维】
Description:题目来源:https://www.acwing.com/problem/content/900/给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。 7 3 8 8 1 0 2 7 4 44 5 2 6 5输入格式第一行包含整数 nn,表示数字三角形的层数。接下来 nn 行,每行包含原创 2021-12-19 23:09:02 · 236 阅读 · 0 评论 -
AcWing 1120. 埃及分数【IDA*】【迭代加深+剪枝】
Description:题目来源:https://www.acwing.com/problem/content/description/1122/Answer:使用IDA*算法。IDA*算法是基于迭代加深的A*算法,迭代加深只有在状态呈指数级增长时才有较好的效果,而A*就是为了防止状态呈指数级增长的。IDA*算法其实是同时运用迭代加深与全局最优性剪枝。如果要寻找长度最短且最小分数最大的最优方案,可以考虑搜索分数项最少的所有情况,然后找到最优解。这样得到的最优解也是全局最优解。很容易想到使原创 2021-12-19 19:05:03 · 347 阅读 · 0 评论 -
102. 二叉树的层序遍历【Leetcode】(BFS)
Description:给你一个二叉树,请你返回其按层序遍历到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层序遍历结果:[ [3], [9,20], [15,7]]链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversalAnswer:采用队列的思想。原创 2021-12-18 16:53:03 · 426 阅读 · 0 评论 -
72. 编辑距离(力扣)【线性DP】
Description:题目来源:https://leetcode-cn.com/problems/edit-distance/给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符Answer:我们假设f(i,j)f(i,j)f(i,j)表示前缀为iii的单词,与前缀为jjj的单词进行匹配,所需要的最少的操作数。匹配肯定是一个一个字符的进行匹配,无非就两种情况。原创 2021-12-17 21:54:35 · 444 阅读 · 0 评论 -
传球问题-矩阵快速幂
Description:传球问题:一共m个人,n次传球。从小明手中传出,经过n次回到小明A手里的方案数。Answer:首先,我们知道,不管是A还是B,都不能自己传给自己,也就是说不能出现AA, BB这种情况。设经过n次传球,回到小明手中的方案数为ana_nan。(第一种传球方式)设经过n次传球,不回到小明手中(指定回到B)的方案数为bnb_nbn。(第二种传球方式)很容易知道b1=1,b2=m−2b_1=1,b_2=m-2b1=1,b2=m−2第一球传球方式: 第二种原创 2021-12-17 00:45:57 · 913 阅读 · 0 评论 -
熄灯问题(枚举)
题目来源:http://bailian.openjudge.cn/practice/2811/Description:有一个由按钮组成的矩阵,其中每行有6个按钮,共5行。每个按钮的位置上有一盏灯。当按下一个按钮后,该按钮以及周围位置(上边、下边、左边、右边)的灯都会改变一次。即,如果灯原来是点亮的,就会被熄灭;如果灯原来是熄灭的,则会被点亮。在矩阵角上的按钮改变3盏灯的状态;在矩阵边上的按钮改变4盏灯的状态;其他的按钮改变5盏灯的状态。用X标记的按钮表示被按下,右边的矩阵表示灯状态的改变。对矩阵中的原创 2021-12-11 12:50:16 · 1457 阅读 · 0 评论 -
主定理(Master Theorem)
主定理是分析分治算法时间复杂度很重要的一个定理。我们之前对于一个递归类的代码进行时间复杂度分析,一般会采用递归树的方式,下面我们先介绍一下递归树的方式,理解之后,再引入主定理的相关内容。分治的介绍分治算法总是将问题的规模不断的拆分,以归并排序为例。假设T(n)T(n)T(n)代表原问题的规模,nnn为输入数据的规模。第一次拆分后,假设拆分成两份,规模就变成了n2\frac{n}{2}2n,然后各自再递归调用归并排序,这部分时间复杂度为2T(n2)2T(\frac{n}{2})2T(2n),最原创 2021-12-08 21:57:37 · 5099 阅读 · 1 评论 -
归并排序(Two Way Merge Sort)
归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而 治(conquer) 的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。整个过程就是:对左边不断划分对右边不断划分合并代码如下(含调试输出过程):#include<iostream>#include<bits/stdc++.h>using namespace std;vector&l原创 2021-12-08 20:43:30 · 353 阅读 · 0 评论 -
卡特兰数(Catalan Number)
卡特兰数(Catalan number) 其实来源于卡特兰解决凸n+2n+2n+2边形的剖分问题得到的数列f(n)f(n)f(n)(为了便于区分组合数,这里用f(n)f(n)f(n)表示)。卡特兰数是组合数学中常出现在各种计数问题中的数列。1,1,2,5,14,42,132...1,1,2,5,14,42,132...1,1,2,5,14,42,132...卡特兰数的性质通项公式: f(n)=C2nnn+1=C2nn−C2nn−1f(n)=\frac{C_{2n}^n}{n+1}=C_{2n}^n-C原创 2021-12-08 20:26:45 · 6043 阅读 · 4 评论 -
剑指 Offer 10- I. 斐波那契数列
Description:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项(即F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。Answer:方法一: 递归肯定超时,别想了。其实也可以结合记忆化原创 2021-12-07 22:39:37 · 333 阅读 · 0 评论 -
Randomized algorithms(随机算法)
随机算法是由一个雇佣问题引出的:假如你要雇佣一名新的办公室助理,但是你先前的雇佣尝试都失败了,你打算找一个雇佣代理。雇佣代理每天给你推荐一个应聘者。你面试这个人,然后决定是否雇佣他,同时你需要付给雇佣代理一定的费用,以便面试应聘者。除此之外,雇佣一个人也需要花费一大笔钱,因为你必须辞掉目前的办公室助理,同时付给雇佣代理一大笔中介费。你承诺:任何时候都找最合适的人来担任这项职务,因此你决定在面试完应聘者之后,如果该应聘者比目前的办公室助理更合适,就会辞掉当前的办公室助理,然后聘用新的。同时你愿意为该策原创 2021-12-06 15:37:06 · 1165 阅读 · 0 评论 -
算法导论习题5.3-4解析
Description:Professor Armstrong suggests the following procedure for generating a uniform random permutation:PERMUTE-BY-CYCLIC(A) n = A.length let B[1..n] be a new array offset = RANDOM(1, n) for i = 1 to n dest = i + offset原创 2021-12-05 11:31:07 · 487 阅读 · 3 评论