
Algorithm
文章平均质量分 95
总结一些常用的算法思路和模版
捡起一束光
某985本硕,热爱分享推荐系统、自然语言处理等优质内容的算法工程师
展开
-
OJ 刷题思路汇总
算法能力的提升是一个漫长的过程,在训练算法过程中要多思考,多总结,寻求正反馈,确保自己的刷题动力!原创 2020-05-28 12:54:23 · 1111 阅读 · 0 评论 -
C++ 高精度乘法模版 大数相乘 高精度 乘以 低精度 | 高精度 乘以 高精度
高精度 X 低精度#include <iostream>#include <vector>using namespace std;vector <int> mul(vector <int> & A, int b) { vector <int> C; int t = 0; for (int i = 0; i < A.size(); i ++) { t += A[i] * b;原创 2020-05-26 10:54:34 · 961 阅读 · 1 评论 -
算法基础 - 数论 | 快速幂、矩阵快速幂、快速乘
文章目录一、快速幂快速幂模版(迭代,非递归)快速幂模版(递归)AcWing 875. 快速幂LeetCode 50. Pow(x, n)(快速幂 C++)LeetCode 372. 超级次方二、矩阵快速幂矩阵快速幂模版例题:求斐波那契数列的第 1e9 项例题: S=A+A2+A3+…+AkS = A + A^2 + A^3 + … + A^kS=A+A2+A3+…+AkREFERENCES一、快速幂快速幂:快速计算某个数的幂次( ana^nan )快速幂时间复杂度为 O(logn)O(logn)O(l原创 2020-05-16 13:25:14 · 1637 阅读 · 1 评论 -
C++ STL 算法——最大值max_element,最小值min_element,求和accumulate
最大值max_element,最小值min_element,求和accumulatemin_element 和 max_element头文件是algorithm,返回值是一个迭代器accumulate 头文件是numeric,第三个参数是初始值,返回值是一个数举个栗子#include <algorithm>#include <iostream>#include <vector>#include <numeric> using namespac原创 2020-05-09 15:18:06 · 5791 阅读 · 1 评论 -
算法基础 - 数论 | 组合数学 卡特兰数(Catalan number)定义、证明及例题
2018.09 大三上 组合数学课堂讲义文章目录Catalan数定义卡特兰数的性质卡特兰数证明(折线法)例:买票例:排队例:典型例题参考文献Catalan数定义卡特兰数的性质(1)求组合数形式Cn=(2nn)n+1\begin{aligned}C_n =& \frac{\binom{2n}{n}}{n + 1} \end{aligned}Cn=n+1(n2n)...原创 2020-05-08 16:37:31 · 6516 阅读 · 0 评论 -
大数相加C++模版(高精度加法)
// "1437983724598723459872349857982347598234759"// "234789235798345798347589347539"#include <iostream>#include <vector>using namespace std;string addString(string s1, ...原创 2020-04-05 12:24:01 · 277 阅读 · 1 评论 -
【LeetCode攻略】使用LeetCode刷题时你必须注意的几个点
LeetCode刷题攻略:详细介绍LeetCode刷题时的各种常用技巧和注意点原创 2020-02-17 21:40:05 · 21934 阅读 · 7 评论 -
最简二分模板——秒杀95%的二分题
文章目录二分最简单模版重要说明例1:LeetCode 69.x的平方根例2:剑指offer 旋转数组的最小数字(二分)二分最简单模版二分的本质:找到丢弃一半的规则二分只有下面两种情况找大于等于给定数的第一个位置 (满足某个条件的第一个数)找小于等于给定数的最后一个数 (满足某个条件的最后一个数)二分模板说明循环必须是l < rif判断条件看是不是不满足条件, 然后修...原创 2020-02-07 09:40:45 · 4260 阅读 · 5 评论 -
ACM排行榜说明 | ACM赛制、OI赛制、IOI赛制 介绍
排名1.先看通过的题目数量 单独绿色+表示通过2.然后看罚时,罚时短的靠前罚时规则罚时=黑色数字累加+绿色数字和*20绿色+后面的数字表示错误提交次数这个次数*20 加到罚时中每个题目下面黑色数字表示做出这个题的时间:从比赛开始到你完成这个题的时间(按分钟算)然后把ac的题的时间数累加到罚时中得到最终罚时单独绿色+表示通过红色- 表示没通过的题和错误提交次数,这个不算在罚时里...原创 2020-01-08 17:53:01 · 8929 阅读 · 1 评论 -
单调栈+固定长度版滑动窗口(队列、下标、单调栈)—— 接雨水
背景n = 8,k = 3每次输出滑动窗口的最小值分析滑动窗口:单调队列优化的最典型问题思路:先想一想暴力如何做,然后从中挖掘一些没有用的元素,删掉,然后可以得到单调性,有单调性再去求极值,就可以直接拿第一个点或最后一个点,把本来要枚举一遍的时间复杂度变成O(1)了用一个队列来维护暴力做法 O(nk),因为每次要遍历一次窗口优化:通过观察可以发现,求最小值时,...原创 2020-01-10 13:32:37 · 680 阅读 · 0 评论 -
透过一张图 彻底明白并查集维护与祖宗结点关系的方法
算法详解238.银河英雄传说(维护与祖宗结点的距离)#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 30010;int m;int p[N], size[N...原创 2019-12-22 11:38:48 · 603 阅读 · 0 评论 -
算法专题 | 二分
文章目录二分最简单模版例题69.x的平方根162. 寻找峰值二分最简单模版二分的本质:找到丢弃一半的规则二分模板循环必须是l < rif判断条件看是不是不满足条件, 然后修改上下界若是r = mid - 1, 则前面mid 语句要加1(记住与r平衡就行)出循环一定是l == r,所以l和r用哪个都可以二分只有下面两种情况找大于等于给定数的第一个位置 (满足某个条件的第...原创 2019-12-28 15:20:21 · 367 阅读 · 0 评论 -
算法专题 | 树 树的遍历(递归 + 迭代写法)
二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。...原创 2019-12-23 11:44:43 · 915 阅读 · 0 评论 -
算法专题 | 链表(再也不用担心面试的链表题了)
做题方法链表题不难,只要你在纸上画个图就很清楚。把思路模拟一遍,主要代码先写在纸上,不要急着敲代码。你会发现在纸上写一下,链表题会特别简单 struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} // 初始化列表法 };常用代码求链表...原创 2019-11-25 10:53:03 · 961 阅读 · 4 评论 -
算法专题 | 位运算
文章目录前言:按位与运算 &按位或运算 |按位异或运算 ^按位取反运算 ~按位左移运算 <<按位右移运算 >>位运算技巧前言:C语言的六种位运算符:&(异或) |(或) ^(异或) ~(取反) <<(左移) >>(右移)按位计算:不产生进位或借位按位与运算 &1 & 1 = 11 & 0 = 0...原创 2019-11-08 17:26:24 · 605 阅读 · 0 评论 -
彻底搞清楚数据范围和笔试题中时间复杂度和空间复杂度分析
数据类型数据范围数量级unsigned int0~42 9496 729542亿 10位int-21 4748 3648~21 4748 36472∗1092*10^92∗109unsigned long0~42 9496 729542亿 10位long (32位系统)-21 4748 3648~21 4748 364721亿...原创 2019-10-11 19:23:38 · 1154 阅读 · 0 评论 -
算法专题 | 双指针(TBD)
文章目录1. 求数组中两个数差的最大值1. 求数组中两个数差的最大值题目描述给定一个数组a,找出a[i] - a[j]的最大值,且满足i >要求时间复杂度为O(n),空间复杂度为O(1)样例输入:650 9 30 2 10 31输出:29题解:-这是我在字节跳动夏令营面试时遇到的题目,拿到题目瞬间就想到了应该要用双指针算法,但可能因为紧张,一下子没想出怎么做...原创 2019-10-08 10:26:58 · 856 阅读 · 0 评论 -
ACM必学 C/C++文件输入输出利器—freopen函数
相信很多人都用过freopen,但是是不是有时候在网上提交代码的时候需要把这句话注释掉,我一开始也是这样的,但还是觉得很麻烦,有时忘记注释,会多错一次,让人很不爽。网上的资料很乱,什么代码都有,也不一定有效但经过我的摸索,你只需要在main函数的开头写上以下代码#ifdef ONLINE_JUDGE #else freopen("in.txt","r",stdin);...原创 2019-08-16 13:08:43 · 4157 阅读 · 1 评论 -
由数据范围反推算法时间复杂度以及算法内容——ACM
引言ACM或者互联网笔试题的时间限制是1秒或2秒。在这种情况下,C++代码中的操作次数控制在10^7为最佳。具体内容下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:n ≤ 30 =>指数级别, dfs+剪枝,状态压缩dpn ≤100 => O(n3n_{}^{3}n3),floyd,dpn ≤ 1000 => O(n2n_{}^{2}n2),O...原创 2019-08-08 09:22:29 · 566 阅读 · 0 评论 -
高斯消元法代码模版 (C++)
#include <stdio.h>#define MAX_SIZE 100/*1 3 5 6 3 4 5 7 6 3 1 2*/float Matrix[MAX_SIZE][MAX_SIZE];float m[MAX_SIZE][MAX_SIZE];float x[MAX_SIZE];int main(void) { //输入矩阵 int ...原创 2019-05-17 14:18:21 · 3328 阅读 · 1 评论 -
欧拉函数代码模板(C++)
#include <bits/stdc++.h>using namespace std;typedef long long ll;#define N 100000int primes[N], euler[N], cnt;bool st[N];/* 欧拉函数可以在 O(n) 的时间复杂度内求出 1~n中所有数的欧拉函数 同时也能算质数质数存在primes[]中(用cnt...原创 2019-05-17 14:12:58 · 1260 阅读 · 0 评论