算法
P19777
这个作者很懒,什么都没留下…
展开
-
判断链表中是否有环,如果有则返回这个环的起始位置
1.判断是否有环设置快慢指针在链表上移动,若两个指针相遇则一定有环。问题来了,为什么有环就一定能相遇,相遇就一定有环?首先,如果无环,那么肯定不会相遇。如果有环,那么最终快指针和慢指针最终都会进入到环中。假设某个时刻开始,两个指针都进入到环中,那么从这时候开始,他们在环中每一步移动,就会使他们之间的距离缩小一步(假设此时以快指针在追慢指针这个角度来看),为什么会缩小?因为慢指针移动一步,快指针移动两步,就相当于慢指针没动,快指针移动一步。最终如果有环就一定会追上。2.返回环的起始位置已知链表中有环原创 2021-03-24 17:55:48 · 380 阅读 · 1 评论 -
快排改进型
对快排进行改进,为什么要进行改进?我们就要分析目前快排存在的问题!首先我们要知道的是,快排的基本思想就是对元素进行分区,选定一个基本值,然后把其他的值放在基准值的左边或者右边,那这样会存在什么问题呢?对于两个数组中存在相同的元素来说,这样的分区是非常没有效率的,因为如果我们选择的基准值在数组中存在了相同的元素,那么这些元素在划分的过程中又会被多排序一次,所以这样不就导致了效率问题。改进的策略是,将元素划分为三个区域,左边区域的元素是小于基准值的,中间区域是等于基准值的,右边区域是大于基准值的,这样就使得原创 2020-05-28 08:59:58 · 288 阅读 · 0 评论 -
LCP 4. 覆盖 状压DP
OJ题意已经非常清楚了,这题其实跟[POJ 2411]这道题类似,算是一个加强版,都是放置多米诺骨牌,不过这个题添加了障碍物,也就是多加了判断而已,不过也在放置逻辑上加大了难度。核心思想依然是:枚举上一行的状态,搜索这一行所有可能的填写情况。我们定义如下这种填充表示方式:如果一个骨牌是横着放的,那么它所在的两个方格都填充1.如果它是竖着放的,那么它所在的两个格子中,上面的那个填0,下面的这个...原创 2020-02-10 10:07:58 · 368 阅读 · 0 评论 -
Leetcode 5335. 参加考试的最大学生数 状压DP
OJ每一行只与上一行有关,看成二进制,同时每一行最多2^8种状态,我们自然想到进行状态压缩状态转移方程为:dp[row][state] = max(dp[row-1][last] + state.count())其中state代表某一个二进制数字,state.count代表当前数字的二进制有多少个1注意我们需要检查合法性,这里包括:本行的合法性:不能把学生安排在坏座位上;不能有相邻...原创 2020-02-09 13:05:33 · 438 阅读 · 0 评论 -
Leetcode 1307. 口算难题
题解因为一共只有10种可能的数字[0-9],所以等式中包含的所有的字符最多包含10种,我们只需要枚举每一种字符对应到每一种数字,得到满足条件的那一个即可,但是要注意,首字符不能为0。思路非常的简单,但是也要注意,处理不当可能会超时。我们如果直接枚举每一种字符可能对应的数字,然后再根据等式计算结果,这样非常可能超时。可以先进行预处理,求出给定的所有串中出现的字符的出现的次数和出现的位置代表的数字...原创 2020-02-06 13:56:22 · 533 阅读 · 0 评论 -
Leetcode 5331 跳跃游戏 V
OJ题意:给定一个数组,数组的值代表一个矩形的高度,我们可以任意选择一个矩形当做起点,然后进行跳跃,每次跳跃的最远距离为d,可以向左或者向右跳,但是不能跳出数组。在一个位置上要想跳到另外一个位置,中间所有的矩形都要比起跳位置的矩形矮,且目标矩形也比起跳矩形矮,问最多访问多少个下标。解:一个动态规划的题,dp[i]表示在下标i位置最多能到达的下标数量,dp[i] = max(dp[k]+1,...原创 2020-02-02 13:09:23 · 172 阅读 · 0 评论 -
Leetcode 1320 二指输入的的最小距离
OJ题意非常的明确,我们直接来进行分析,要求出最小的移动距离,其实非常容易的我们就能想到两个手指最开始的位置,一定都是在键盘中的某个输入串中包含的字符上面的,但是我们并不能确定在哪个位置。不过,我们能确定其中一个手指最开始的位置,那就是输入串第一个字符所在位置,这一点其实非常容易想通,因为我们不管把手指放在什么位置,都要移动去输入第一个字符,那还不如直接放在第一个字符上,但是第二个手指并不能这样...原创 2020-02-01 15:14:28 · 402 阅读 · 0 评论 -
LeetCode 1335. 工作计划的最低难度
OJ题意给定一组工作序列的难度,给定天数。完成第i个工作的时候,必须要先完成(0,i-1)的工作,每天的工作难度是这一天完成的工作中难度最大的那一个,每天的难度之和为完成这组工作难度的总和,每天都必须要有工作。题解典型的动态规划的题目,用dp[i][j]来表示i天一共完成j个任务的最小难度。关系怎么递推呢?i天要完成j个任务,只要将这j个任务分配给这几天就可以了,求出最小分配,假设i天完成...原创 2020-01-30 14:48:28 · 321 阅读 · 0 评论 -
阈值距离内邻居最少的城市 leetcode 1334
oj:https://leetcode-cn.com/problems/find-the-city-with-the-smallest-number-of-neighbors-at-a-threshold-distance/题意:给定一个有权无向图,图上的每一个点都是一座城市,给定一个阀值(最大权值)。在给定的阀值内求出这些城市能到达的城市数量最少的那个城市。只要利用Flo...原创 2020-01-30 12:35:05 · 352 阅读 · 0 评论 -
多源最短路 Floyed
Floyed的核心思想就是枚举出每两个点之间,所有的边的情况,求出最短路径for(k=1;k<=n;k++) //枚举中间 for(i=1;i<=n;i++) //枚举起点 for(j=1;j<=n;j++) //枚举终点 d[i][j]=min(d[i][k]+d[k][j],d[i][j]);...原创 2020-01-26 14:37:34 · 203 阅读 · 0 评论 -
扩展欧几里得算法
贝祖等式在数论中,裴蜀等式(英语:Bézout’s identity)或贝祖定理(Bézout’s lemma)是一个关于最大公约数(或最大公约式)的定理。裴蜀定理得名于法国数学家艾蒂安·裴蜀,说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性丢番图方程(称为裴蜀等式):ax + by = m有整数解时有解当且仅当m是d的倍数。裴蜀等式有解时必然有无穷多个整数解,每组解...原创 2020-01-13 11:46:25 · 967 阅读 · 0 评论 -
Java实现简单的数学表达式计算
public class T { public static void main(String[] args) { long calculate = calculate("12+2312*(623+23*61*(6))"); System.out.println(calculate); } public static long calc...原创 2019-12-19 16:37:15 · 2118 阅读 · 0 评论 -
欧几里得(GCD)算法正确性证明,LCM正确性证明
欧几里得算法要解决的是求两个数最大公约数的问题。gcd(a,b) = gcd(b,a%b)这个算法的过程可以举个例子来展示,如果我要求168和44的最大公约数,用欧几里得算法可以这样求:168=44*3+3244=32*1+1232=12*2+812=8*1+48=4*2+0最终这个4就是最大公约数证明gcd也就是要证明gcd(a,b) = gcd(b,a%b...原创 2019-11-29 20:13:52 · 1672 阅读 · 0 评论 -
组合数的降解计算
组合数公式:Combin(m,n)=m!/[(m-n)!*n!]因为在程序计算的时候会存在一个问题,m!的阶乘非常大的,我们就不能直接将分子和分母计算出来然后进行相除,这就需要用到降解。Combin(m,n) = Combin(m-1,n-1) + Combin(m-1,n)这个等式,表明任意m选n组合的计算,可以分解为:【m-1 选 n-1的组合数】 + 【m-1 选 n 的组合数】 之...原创 2019-11-29 15:51:09 · 543 阅读 · 0 评论 -
分糖果 01背包
OJ:http://acm.lsnu.edu.cn/oj/problem.php?id=2400算法的主要思路是01背包。有n个糖果,每个糖果都有个重量值,要把平分糖果分给两个人,两个人分得的重量要相等且要尽量的大!多余的糖果可以送出去,注意糖果不能被切开。因为要把多余的糖果送出去,所以我们可以枚举送出去的糖果,然后剩下的糖果如果能被两个人平分的话,这就是一组答案。然后记录下送出去...原创 2019-11-27 15:54:51 · 402 阅读 · 4 评论 -
无向图最小环问题
开端源于一个题:http://oj.coder.ac.cn/problem/INT2007题意:给定一些数作为图中的一个点,如果这些数中的某个二进制位相同,则两个数能进行连接,也就是图上的两个点能进行连接。最终需要我们求的是,图中的这些点形成的最小的环上的点的个数,如果没有形成环,输出-1。首先我们可以知道的是,如果有超过3个数的二进制位相同,那么最小环一定是3,因为这三个数一定能...原创 2019-11-26 10:42:59 · 515 阅读 · 0 评论 -
巴什博弈 POJ 2149
poj:http://acm.hdu.edu.cn/showproblem.php?pid=2149非常经典的巴什博弈,两个人都依次报数,每一个每次可以报1-m的数,把他们两个说的数加起来,谁先加到n(大于等于),谁就赢,两个人都非常地聪明,都想自己能赢。假设现在有两个人a,b。假设a先数,怎么能确保自己赢呢?第一步该说多少?其实这个n,中间地很多都是无效地,我们可以直接将r =n%...原创 2019-11-22 13:26:13 · 198 阅读 · 0 评论 -
详解约瑟夫问题 dp
使用链表的方式这里就不进行介绍了,这里主要介绍的是dp方式的解决,重点在于公式的讲解。假设我们现在有n个人,那么这了n个人杀掉一个人之后,就变成了一个n-1个人的问题了,这就是一个子问题,dp的思想就应该出来了,那么要如何找到n个人的问题和n-1个人的问题之间的关联呢?现在有n个人,我们从第一个人开始数,直到数到第k个人,那么数到的第k个人就被删除了。剩下了n-1个人,然后又重复进行...原创 2019-11-10 21:03:51 · 367 阅读 · 0 评论 -
求1*2*3*……*N所得数末尾有多少个0
n(1<=n<=2^(31))。所以说,暴力的方法就别想了,这很明显就是个数学问题,要我们去发现数学规律。要出现0,就需要有2和5,当然10也可以,不过10肯定也能因式分解为2和5,所以也就可以看做2和5。我们的最终目的就是寻找这个1-N这些数中能找到多少对2和5,有多少对2和5就有多少个0。在0-N的数中,我们假设对每一个数进行分解,都尝试去分解成2和5。当然不是所有的数都可以分...原创 2019-11-06 17:34:20 · 4701 阅读 · 0 评论 -
审美课 位运算题
oj:http://lx.lanqiao.cn/problem.page?gpid=T519蓝桥杯的题,比较简单的一个题目,因为画最多只有20幅,且小朋友的判断只存在两种状态,所以可以直接使用一个二进制数来表示一个小朋友的判断,这样就可以非常简单了保存所有小朋友的判断结果,且利用"^"运算符,也能非常简单的判断两个小朋友的判断是否完全不相同。需要注意的是,题目中说的是完全相反。...原创 2019-11-02 21:22:31 · 124 阅读 · 0 评论 -
HDU-1059 01背包问题
OJ:http://acm.hdu.edu.cn/showproblem.php?pid=1059大意:有6种不同大小的弹珠,价值依次为1-6。现在给你一些这些不同种类的弹珠,让你进行分配,使两个人手上的弹珠价值之和相同,一个弹珠不能划分。01背包问题,就是种物品只有一个,多重背包问题,就是每种物品有指定个,完全背包问题,就是每种物品有无穷个。这个题看起来像一个多重背包问题,每一...原创 2019-11-01 21:13:33 · 199 阅读 · 0 评论 -
Network UVALive - 3902 dfs 贪心 树转图 树的性质
OJ:https://vjudge.net/problem/UVALive-3902题目大意:给你一棵树,但是这个树是没有指明根节点的,也就是一个没有回路的图。图上有很多的节点,客户端在叶子节点上,有一个服务器位于s位置,一个服务器的覆盖范围最多是k个距离,大于k的就不能进行覆盖了,现在的需求是覆盖到所有的客户端,问最少还要加几个服务器。感觉是一个很有意思的题,但是题面的描述并不清楚...原创 2019-10-31 23:02:25 · 272 阅读 · 0 评论 -
UVA - 12569 BFS 状压DP
题目大意:给你一个无向图,一个机器人位于图中的点s位置,他的目标是点t位置,你可以移动他,每一次只能移动一个位置,图上有m个障碍物,这些障碍物也可以移动,这些障碍物分布在图上的不同点,任何一个点同一时刻只能有一个物品,不管是机器人还是障碍物。最后问最少需要移动几次(不只是机器人的移动,还包含障碍物的移动)。输出移动的过程,从哪个点到哪个点。这个题说实话还挺难的,主要是因为题目中涉及到的可以...原创 2019-10-30 22:04:50 · 227 阅读 · 0 评论 -
HDU-1251 统计难题
老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀)就是一个简单的字典树的题,写个字典树就OK了,但是要注意,解题的时候的字典树注意要尽量避免去使用动态开内存的情况,因为,内存可能会爆炸,题目中也说了。只有50000个单词,每个单词最多10个字符,那么也就是说,字典树中最多只有500000个节点,我们直接将...原创 2019-10-29 08:59:53 · 240 阅读 · 0 评论 -
CodeForce-20c
水题水题,最简单的最短路问题,直接套模板就可以了,因为没有负权边,Bellman-ford,Dijkstra,spfa,都没问题,但是时间上就说不准了。还有一个优化的点在于,因为两个点之间可能并没有路连接,所有可以使用并查集进行优化,先判断两个点之间有路,没有路就不用进行查找了。另外一个要注意的点就是最大值的问题,因为w的最大值是10的6次方,所以用int的话,可能会溢出,所以,di...原创 2019-10-28 11:17:42 · 135 阅读 · 0 评论 -
最短路算法 - SPFA
前面讲解过最短路算法Bellman-ford,这个算法看起来非常不错,但是存在一个非常严重的问题,什么问题?无效的松弛操作太多了,导致时间复杂度比较高,其实每次内层循环进行松弛的时候,我们只用松弛那些之前有过有效松弛的点,之前本来就是无效松弛的点,你这一次利用该点来松弛别人本来就是无效的啊,你自己到源节点的最短路都是最大的,还想用这个最大值来使别人最短路减小?你自己到源节点的最短路从上次松弛之...原创 2019-10-21 20:22:49 · 162 阅读 · 0 评论 -
最短路算法 - Bellman-Ford
在了解该算法之前,可以去了解迪杰特斯拉算法,然后再回来看这个。我们都知道迪杰特斯拉求解最短路的时候,图中是不能存在负权边的,因为如果存在负权边的话,迪杰斯塔拉可能不能得到正确的结果。比如下面这种情况,起点1,终点4这种情况在迪杰斯特拉中会先求出1,3、然后求出3,4、再求出1,2。这很明显就出现了问题,到4的最短路我们很容易看出权值和应该为-5,但是用迪杰斯特拉求出来变成了3。因为...原创 2019-10-21 17:37:41 · 265 阅读 · 0 评论 -
HDU 3374 KMP加最小表示法
OJ:http://acm.hdu.edu.cn/showproblem.php?pid=3374题意:给你一个字符串,长度为len,你要把他想象成环形字符串。比如给定SKYLONG然后环形串中可能就出现下面这些可能SKYLONG 1KYLONGS 2YLONGSK 3LONGSKY 4ONGSKYL 5NGSKYLO 6GSKYLON 7环形串是上面这种形式...原创 2019-10-19 10:13:36 · 153 阅读 · 0 评论 -
最小表示法 - 一个循环串中,字典序最小的串
最小表示法使得一个环形字符串有唯一的读法,这个读法是所有读法中字典序最小的。什么意思呢?给你一个字符串 :1234567他的读法有1234567,2345671,3456712,4567123等等字典序最小的读法很明显就是1234567本文讲解的是最小表示法的O(n)求法。对于这种环形问题,一个常规的做法是把它自己复制一遍,接到原串之后。问题就转换成了求在字符串s中长度...原创 2019-10-14 16:27:18 · 1110 阅读 · 1 评论 -
求解最大矩阵和
什么叫最大矩阵和,给你一个包含数字的矩阵,每一个矩阵格子都包含一个数字,当然有正有负,求出其所有子矩阵中最大的那个和。给定的这个矩阵也可以算一个子矩阵。解决1.暴力,枚举左上角的点和右下角的点,利用前缀和,然后就能求出结果,时间复杂度O(n²*n²)2.动态规划加预处理,一维矩阵的最大连续和我们要把二维矩阵进行降维,把二维矩阵降成一维数组首先要知道一点,我们的最大的...原创 2019-10-14 10:44:55 · 1028 阅读 · 3 评论 -
二叉搜索树 HDU 3791
OJ:http://acm.hdu.edu.cn/showproblem.php?pid=3791题意:给你一个长度不大于10的只有数字的字符串,字符串中不包含重复数字。将这个字符串按顺序插入二叉搜索树。然后再给你一些字符串,条件与上面一样。判断这些字符串生成的二叉搜索树与第一个字符串生成的二叉搜索树是不是一样的!思路:将第一个串插入二叉搜索树,前序遍历得到遍...原创 2019-10-13 20:57:12 · 155 阅读 · 0 评论 -
魔咒词典 - HDU 1880 hash表
OJ:http://acm.hdu.edu.cn/showproblem.php?pid=1880题意还是非常的清楚,给你一个键值对,需求是给出k的时候,查出v,给你v的时候,查出k。还要注意的是,输出结果的时候,k中的[]是不会被输出的,但是查询的时候给出的k是包含[]的,且题中说明了魔咒个和字符串中都不会包含[]这两个字符。解析:其实这个题,使用有标准库的语言非常好实现...原创 2019-10-13 19:59:55 · 180 阅读 · 0 评论 -
HDU 1232 并查集入门题
并查集的入门题,非常的简单,只要懂一点并查集就能写出来,就不解释了。#include<stdio.h>#include<stdlib.h>#define MAX 1000void connect(int *nums,int a,int b){ a = find(nums,a); b = find(nums,b); nums[...原创 2019-10-13 10:19:40 · 125 阅读 · 0 评论 -
find the nth digit HDU-1597 区间二分查找
OJ:http://acm.hdu.edu.cn/showproblem.php?pid=1597题目是中文的就不需要翻译了,我自己踩在了一个坑里,好久才爬出来。我们可以先有一个数组去保存好每一个S串的结束位置,第一个S串结束位置为1,第二个为3,第三个为6,把这些记录下来。然后我们就可以进行二分的区间查找,找到输入的n是属于哪一个S串中的,然后就能得到答案了数组的长度不能太...原创 2019-10-13 08:52:18 · 174 阅读 · 0 评论 -
HDU-3729 I'm Telling the Truth 二分图 匈牙利算法模板题
OJ:http://acm.hdu.edu.cn/showproblem.php?pid=3729题意:n个学生报分数,但是他们只说了自己的分数在哪个区间,没有说具体的值,老师想知道最多可能有多少学生说的是真话,让我们输出最多的人数,和哪些学生说了真话,输出的学生编号要是从小到大的,但是又是字典序最大的那一个。这个题是我刚接触到匈牙利算法的一个模板题,我这里主要不是讲解匈牙利算...原创 2019-10-11 21:17:22 · 147 阅读 · 0 评论 -
UVA 11019 AC自动机-二维模式串匹配
OJ:https://cn.vjudge.net/problem/UVA-11019简单翻译:给你一个n*m的字符矩阵T,在给你一个x*y的字符矩阵P,问P在T中能完全匹配几个位置。这个题我们利用AC自动机解决首先要解决两个问题:1.要想P与T的的某个位置完全匹配,那么P的每一行要与T的对应的部分匹配,所以可以把P每一行看成模式串构造出AC自动机。然后在T中每一行逐一匹配...原创 2019-08-16 15:19:39 · 201 阅读 · 0 评论 -
POJ 1155 树状DP
OJ:http://poj.org/problem?id=1155简单翻译:电视台转播节目。对于每个节点,如果其存在子节点,其子结点可能是用户,也可能是中转站。但是用户肯定是叶子结点。传到中转站或是用户都要花钱,如果是用户,则收钱。问在不亏本的前提下最多能有多少个用户看到节目。一开始看到这个题目想法完全错误,以为是简单DP问题,理解错了,想象成了求最大利润,后来发现并不是这么简单。...原创 2019-08-20 15:09:37 · 150 阅读 · 0 评论 -
HDU 1043 广搜,优先队列,A*算法
HDU:http://acm.hdu.edu.cn/showproblem.php?pid=104315谜题已经有100多年历史了。即使不知其名,肯定也见过。它由15个滑动块组成,每个滑动块由数字1到15标记,并且被放在4x4大小的框框里面,缺失一个块。缺失的称之为x。谜题的目标就是将这些块有序的整理起来。如下图:1 2 3 45 6 7 89 10 11 12...原创 2019-08-24 11:31:35 · 278 阅读 · 0 评论 -
Substring UVA - 11468 AC自动机加记忆化
OJ:https://vjudge.net/problem/UVA-11468简单翻译:给出一些字符和各自被选择的概率,随机选择L次之后,得到一个长度为L的随机字符串S,每次选择互相独立。给出K个模板串,计算S不包含任何一个模板串的概率,既S的任意一个子串都与K个模板串的任何一个相同分析:计算不包含模板串的概率,也就是要计算我们每次选择不会出现于模式串相同的子串的那些选择的概...原创 2019-08-14 22:57:48 · 137 阅读 · 0 评论 -
POJ-2376 简单的区间贪心问题
题目链接:http://poj.org/problem?id=2376简单翻译:给你一个长度为T的时间区间,区间从1开始,每一个时间点都需要有奶牛在工作,有N头奶牛,给你每个奶牛的工作区间,让你从这些奶牛中选一些奶牛,让其覆盖T这个时间区间,有两个条件1.每个时间点都需要有奶牛工作2.尽可能少的使用奶牛分析我们可以字节把题目中给定的条件就想象成一个一个的区间,让我们先...原创 2019-08-09 20:46:47 · 292 阅读 · 0 评论