![](https://img-blog.csdnimg.cn/20190927151124774.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法
文章平均质量分 90
对一些算法的学习总结
晴空๓
和优秀的人,做有挑战的事!一起加油 (ง •̀o•́)ง (ง •̀o•́)ง
展开
-
LeetCode 2923. 找到冠军 I——更好的解法
今天看了一下昨天每日一题的题解,发现了更好的解法只需要O(n)的时间复杂度就可以解出,而不是像我上一篇博客一样需要O(n^2)的时间复杂度才可以解决。具体的思路是这样的,这个本质上就是 打擂台,如果当前的队伍输了那么该队伍就不可能是冠军,所以我们只需要一开始假设 0队 是冠军,然后与 1队 进行 PK。如果 grid[1][0] == 1 说明1队获胜,那么0队就不可能是冠军。再用1队与2队进行PK,赢了就继续与3队PK,输了说明也不是冠军,再用2队与后面的队伍PK,直到与所有的队伍PK完即可得到冠军队伍原创 2024-04-13 11:05:16 · 408 阅读 · 0 评论 -
算法竞赛常用知识
本篇博客来整理一下在算法竞赛中经常用到但是可能会忘掉的知识,有些知识平时可能会记得,但是到真正算法竞赛的时候可能就会忘掉,甚至有一些很常见的知识再平时就忘掉了。但是在算法竞赛中碰到相关的题目还不得不使用这些知识,如果在算法竞赛的时候想不起来那是非常可惜的。所以来总结一下一些在刷题中常用的知识以及需要注意的地方,如果有不足或者需要补充的地方欢迎大家评论留言,博主也会随时补充更新。原创 2021-04-14 20:43:21 · 1124 阅读 · 0 评论 -
分解质因数
把一个合数用质因数相乘的形式表示出来,叫做分解质因数。分解质因数可以使用 试除法 来分解,即从小到大枚举每一个数 d,如果 d 可以整除 n,则从 n 中除掉所有的因子 d,同时累计除去 d 的个数。通过唯一分解定理,可以知道一个合数的因子一定在扫描到这个合数之前就被其更小的质因子 d 除掉了,所以能整除 n 的一定是质数。原创 2021-04-03 17:08:12 · 7521 阅读 · 1 评论 -
质数的筛法
本文只要包含的内容为:质数的定义,质数的四种判定方法。试除法判定、朴素筛法、埃式筛法和线性筛法的详解。原创 2021-04-03 10:43:37 · 1500 阅读 · 9 评论 -
算法竞赛的一些小技巧
本篇博客来总结一下博主所了解的有关算法竞赛的一些小技巧,如果有不足或者需要补充的地方欢迎大家评论留言,我会随时补充更新。原创 2021-03-30 20:52:59 · 2819 阅读 · 10 评论 -
C++ STL详解(4)
STL 是“Standard Template Library”的缩写,中文译为“标准模板库”。STL 是 C++ 标准库的一部分,不用单独安装。 C++ 对模板(Template)支持得很好,STL 就是借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。例如,vector 的底层为顺序表(数组),list 的底层为双向链表,deque 的底层为循环队列,set 的底层为红黑树,hash_set 的底层为哈希表。原创 2021-02-22 16:51:00 · 1192 阅读 · 28 评论 -
C++ STL详解(3)
STL 是“Standard Template Library”的缩写,中文译为“标准模板库”。STL 是 C++ 标准库的一部分,不用单独安装。 C++ 对模板(Template)支持得很好,STL 就是借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。例如,vector 的底层为顺序表(数组),list 的底层为双向链表,deque 的底层为循环队列,set 的底层为红黑树,hash_set 的底层为哈希表。原创 2021-02-22 15:07:15 · 593 阅读 · 0 评论 -
C++ STL详解(2)
STL 是“Standard Template Library”的缩写,中文译为“标准模板库”。STL 是 C++ 标准库的一部分,不用单独安装。 C++ 对模板(Template)支持得很好,STL 就是借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。例如,vector 的底层为顺序表(数组),list 的底层为双向链表,deque 的底层为循环队列,set 的底层为红黑树,hash_set 的底层为哈希表。原创 2021-02-21 12:31:14 · 2108 阅读 · 6 评论 -
C++ STL详解(1)
STL 是“Standard Template Library”的缩写,中文译为“标准模板库”。STL 是 C++ 标准库的一部分,不用单独安装。 C++ 对模板(Template)支持得很好,STL 就是借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。例如,vector 的底层为顺序表(数组),list 的底层为双向链表,deque 的底层为循环队列,set 的底层为红黑树,hash_set 的底层为哈希表。原创 2021-02-19 22:07:12 · 1584 阅读 · 4 评论 -
如何由数据范围反推算法复杂度以及算法内容
我们可以根据题目给出的数据范围来大致的判断一下对于该题我们使用的算法的时间复杂度大致为多少,也就帮助我们更快的找到可以用什么算法来解决该问题,更快更好的完成题目。原创 2020-08-25 20:58:02 · 2853 阅读 · 42 评论 -
递归实现指数型枚举(递归)
从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。原创 2020-08-24 15:22:20 · 4198 阅读 · 53 评论 -
直接插入排序详解
这篇博客来详解一下插入排序算法中的直接插入排序。原创 2020-08-13 20:59:13 · 2911 阅读 · 36 评论 -
数组元素的目标和(双指针算法)
给定两个升序排序的有序数组A和B,以及一个目标值x。数组下标从0开始。请你求出满足A[i] + B[j] = x的数对(i, j)。原创 2020-08-02 16:10:57 · 459 阅读 · 0 评论 -
计蒜客 T1101:大整数的因子(高精度除法详解)
已知正整数 k 满足 2 ≤ k ≤ 9,现给出长度最大为 30 位的十进制非负整数 c,求所有能整除 c 的 k。原创 2020-07-24 18:31:05 · 1983 阅读 · 39 评论 -
计蒜客 T1100:计算2的N次方(高精度乘法详解)
任意给定一个正整数 N (N≤100),计算 2 的 N 次方的值。原创 2020-07-24 00:35:28 · 3808 阅读 · 22 评论 -
计蒜客 T1099:大整数减法(高精度减法详解)
求两个大的正整数相减的差。原创 2020-07-21 13:04:44 · 3573 阅读 · 38 评论 -
计蒜客T1098:大整数加法(高精度加法详解)
高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,`高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。`对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个==数组==中, `用一个数组去表示一个数字`,这样这个数字就被称为是`高精度数`。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算原创 2020-07-17 23:16:06 · 3715 阅读 · 18 评论 -
经典排序算法之归并排序详解
大家好,这篇博客来记录一下归并排序算法的详细实现原理以及归并排序的模板。原创 2020-07-12 22:07:50 · 2445 阅读 · 63 评论 -
经典排序算法之快速排序详解
快速排序是对冒泡排序的一种改进。冒泡排序的时间复杂度为O(N²),这是一个非常高的时间复杂度。冒泡排序早在 1956 年就有人开始研究,之后有很多人都尝试过对冒泡排序进行改进,但结果却令人失望。如 Donald E. Knuth(中文名为高德纳,1974 年图灵奖获得者)所说:“冒泡排序除了它迷人的名字和导致了某些有趣的理论问题这一事实之外,似乎没有什么值得推荐的。”原创 2020-07-10 23:14:01 · 1628 阅读 · 29 评论 -
C++ sort()排序详解
本文对C++中的sort()做了一个比较详细的说明,包括为什么选择使用sort()、sort()函数的实现原理、sort()的使用方法等等。原创 2020-05-05 22:00:36 · 398369 阅读 · 192 评论 -
数据结构——队列的详解
队列和栈相反,队列(queue)是一种先进先出(FIFO:first in first out)的线性表。它只允许在表的一端进行插入,而在另一端删除元素。队列和我们日常生活中的排队是一致的,最早进入队列的元素最早离开。在队列中,允许插入的一端叫队尾(tear),允许删除的一端称为队头(front)原创 2020-04-21 12:55:45 · 5209 阅读 · 26 评论 -
数据结构——栈的详解
栈和队列是两种重要的线性结构,从数据结构的角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表的子集。他们是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,他们是和线性表大不相同的两类重要的的抽象数据类型。C语言和C++中的栈C语言中的栈栈的定义C语言中栈的基本操作栈的初始化判断是否为空栈判断是否为满栈入栈出栈C语言实现栈的具体代码C++中的栈C++中栈的基...原创 2020-04-20 00:02:43 · 79568 阅读 · 86 评论 -
斐波那契数列的求法
1、斐波那契数列的递归求法(不推荐使用,一般都会超时):原理:把fib(n) 问题的计算拆分成 fib(n-1)和fib(n−2) 两个子问题的计算,并递归,以 f(0) 和 f(1) 为终止条件。缺点:需要大量的递归计算,用该很容易超时。#include<iostream>using namespace std;long fib(int n){ if(n==...原创 2020-04-14 22:59:59 · 2351 阅读 · 16 评论 -
0~1间浮点实数的表示(位运算)
题目描述:给定一个介于0~1之间的实数(如0.625),类型为double,打印它的二进制表示(0.101)。如果该数字无法精确的表用32位以内的二进制表示,则打印"ERROR"。解题思路:将小数转换成二进制可以每次将小数乘以2。如果大于等于1,那么就在小数点后相应位置填1,然后将整数部分的1消掉只剩下小数部分继续乘以2;如果小于1那么就在相应的位置填0,直到结果为0。比如0.625,第一次乘...原创 2020-03-25 22:37:23 · 2096 阅读 · 16 评论 -
将整数的奇偶位对换(位运算)
题目描述:将一个数的二进制的奇偶位对换位置。例如9的二进制1001 对换完成后为0110 变成了6。解题思路:使用位运算将输入的数字和1010101010......(一共32位16对10)做与运算取出偶数位,然后再将输入的数字和0101010101......(一共32位16对10)做与运算取出奇数位。最后将偶数位右移一位,奇数位左移一位做异或运算实现奇偶位交换。java代码:pu...原创 2020-03-25 21:24:19 · 1704 阅读 · 9 评论 -
是不是2的整数次方(位运算)
题目描述:用一条语句判断一个整数是不是2的整数次方。解题思路:题目的关键是只能用一条语句判断。所以使用不断除以2直到结果为1的方案就行不通了。可以使用位运算中的与运算来解这个题目。是输入的数字n与n-1做与运算,如果结果等于0,那么就证明这个n是2的整数次方,因为n用二进制来表示,如果只有1个1,其余都为0,这个n才是2的整数次方。比如8 二进制为1000, 8&7 1000&am...原创 2020-03-19 23:53:49 · 1497 阅读 · 2 评论 -
二进制中1的个数(位运算)
上一个博客写了两种计算二进制中1的个数(https://blog.csdn.net/qq_41575507/article/details/104964219),还有第三种方法:这种方法就是不断地用N和N-1做与运算,消除1。比如9的二进制为1001,8的二进制为1000 。 1001&1000 = 1000 这样就相当于消掉了1001中的一个1,然后再用8与7做与运算即1000&...原创 2020-03-19 21:14:36 · 1495 阅读 · 2 评论 -
二进制中1的个数(位运算)
题目描述:输入一个函数,输出该数二进制表示中1的个数。(例如:9的二进制为1001,有两个1,所以输出2)解题思路:可以直接使用位运算中的与运算(&)来做这道题目。用1从右到左移动与N做与运算,然后判断得到的结果是不是和1右移i位之后的得到的结果相同,相同就证明该位上的二进制为1.那么就使count+1.比如9的二进制为1001,1右移三位得到的结果为1000,1001 & 1...原创 2020-03-19 12:24:06 · 1577 阅读 · 4 评论 -
找出唯一成对的数(位运算)
题目描述:学习总结:每个元素只能访问一次,所以不能用双重for循环来遍历数组来找相同的数字;不能使用辅助空间,所以不能使用另外开一个数组来将多有数字出现的次数存起来然后再将次数等于2的数字输出来找重复的数字。但是我们可以根据异或运算的性质来做这个题目。任何数与0做异或运算都等于它本身,两个相同的数字做异或运算等于0。所以我们可以将这个含有唯一成对数字的数组与(1^2^3^4^5……^99...原创 2020-03-13 21:39:50 · 1519 阅读 · 1 评论 -
ACM常见单词
1、constant n、常数,常量 adj、不变的,始终如一的,持续不断的2、assigned adj、指定的,赋值的3、fractional 分数的,小数的4、left or right-justified 左对齐or右对齐 justified adj、合理的,合法化的5、precision n、精密,精确度、精确6、d...原创 2019-05-04 21:06:37 · 3350 阅读 · 2 评论 -
大数运算1(如何存放大数以及输出)
很多程序题目都会涉及到大数问题(少则几十位数字多则几万位),那么如何存储大数呢?基本的思想就是用数组或者字符串存放以及表示大整数。用字符串进行大数存储,如果进行运算,可以根据ASCII值减去0的ASCII值进行运算。比如在字符串中a[0] = '4',字符4的ASCII值是52,而0的ASCII值是48,用52减去48正好是数字4。9的ASCII的值是57,用57减去48正好为数字9...原创 2019-05-16 23:53:54 · 2860 阅读 · 2 评论 -
PTA乙级 1002 写出这个数
题目:读入一个正整数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。输入格式:每个测试输入包含 1 个测试用例,即给出自然数n的值。这里保证n小于10100。输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。输入样例:1234567890987654321123456789输出...原创 2019-05-17 15:51:45 · 1351 阅读 · 2 评论 -
如何求最小公倍数
第一种方法(穷举法):#include<iostream>#include<cstdio>#include<cmath>using namespace std;int long fun(long n,long m){ //如果n和m的乘积为0,则0为n和m的最小公倍数 //ps:一般不考虑0和一个整数的最小公倍数,如果考虑则为0 if(...原创 2019-06-05 15:29:11 · 5671 阅读 · 3 评论 -
如何判断素数
素数(Prime number,又称质数),指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个正因数的数)。大于1的自然数若不是素数,则称之为合数(也称为合成数)。例如,5是个素数,因为其正约数只有1与5。而6则是个合数,因为除了1与6外,2与3也是其正约数。算术基本定理确立了素数于数论里的核心地位:任何大于1的整数均可被表示成一串唯一素数之乘积。...原创 2019-06-02 20:06:13 · 18125 阅读 · 2 评论 -
求最大公约数(辗转相除法)
最大公约数(Greatest Common Divisor)指两个或多个整数共有约数中最大的一个。也称最大公因数、最大公因子,a, b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个 整数的最大公约数也有同样的记号。求最大公约数有多种 方法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。与最大公约数相对应的概念是最小公倍数,a,b的 最小...原创 2019-06-03 16:20:50 · 111159 阅读 · 18 评论 -
C语言分数约分
先求出分子和分母的最大公约数,然后使分子分母同除以它们的最大公约数即可实现分数的约分。#include<iostream>#include<cstdio>using namespace std;//递归求出分子和分母的最大公约数 int Gcd(int m,int n){ if(n==0) return m; return Gcd(n,m%n);}...原创 2019-06-03 20:02:20 · 12446 阅读 · 4 评论 -
PTA团体程序设计天梯赛:L1-009 N个数求和 解题笔记
自己写的代码,可能没有那么简洁但是思路还是很清晰的。以后会不断优化这个程序。20分只能拿到17分(改了一晚上实在找不出bug了。。。希望看到这篇文章的小哥哥小姐姐能够帮我找一下)。有1个后台测试样例过不去,如果你能想到特殊的测试样例请在评论区评论,谢谢小哥哥小姐姐啦!找不出第三个测试点的bug#include<iostream>#include<cstdio...原创 2019-06-04 00:15:44 · 2214 阅读 · 9 评论 -
简单的桶排序:初级桶排序(1)
这是一个简单的桶排序,桶排序就是先开一个足够大的数组全部赋值为0表示一次都没有出现然后将数据输入,在输入的时候将数字对应的数组中的数据加一,表示出现了几次。注意:这个简单的桶排序需要知道排序的范围。当要排序的范围非常非常大的时候就不要用这个方法了,因为当排序范围非常大的时候这个方法就变得很浪费空间。而且这个简单的桶排序方法只是针对整数范围并且知道排序范围而且范围比较小的情况。#include...原创 2019-07-28 14:25:17 · 1241 阅读 · 1 评论 -
冒泡排序(1)
冒泡排序的原理是每次将相邻的两个数据进行比较,这里假设从大到小排序,那么当前一个数据比后一个数据小的时候就将两个数据的位置调换。这样在进行一次循环遍历之后就可以将第一个数字放在整个数组比较合适的位置。随着循环的遍历数据的位置会越来越精确,知道最后一次循环遍历之后整个数组就会按照从大到小的顺序排序。排序的过程可以看下图:下面我们根据这个原理将代码写出来,然后将每次循环遍历排序之后的数组打印出...原创 2019-08-09 11:05:26 · 1185 阅读 · 0 评论 -
C语言结构体+冒泡排序做一个简单的成绩单排序程序
结构体可以封装多种类型的数据,将多种数据类型组合成一个数据类型。C语言中有int、char、float、double等等数据类型,但是这些类型都是分开的。这里我们就可以使用结构体将这些数据类型组合成一个数据类型来使用,这样可以让我们更方便的将多种数据类型捆绑在一起使用(详情可以看一下中国大学生慕课苏小红老师讲的C语言课程)。比如,你可以将一个学生的姓名、学号、成绩等信息使用结构体组合在一起使用,可...原创 2019-08-09 16:33:35 · 7561 阅读 · 6 评论