![](https://img-blog.csdnimg.cn/20200403071323945.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法学习
文章平均质量分 79
主要是用于自己在算法学习过程当中的经验和教训的总结
lies@
这个作者很懒,什么都没留下…
展开
-
代码随想录算法训练营第二天 | 977.有序数组的平方 、 209.长度最小的子数组、59.螺旋矩阵II
文章讲解:https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html。文章讲解:https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html。输入:target = 4, nums = [1,4,4]原创 2024-01-25 23:46:14 · 335 阅读 · 0 评论 -
蓝桥杯基础算法总结(整体复习用)
目录原创 2020-10-16 22:07:01 · 2082 阅读 · 0 评论 -
基础算法
785. 快速排序题目给定你一个长度为n的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数 n。第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。输出格式输出共一行,包含 n 个整数,表示排好序的数列。数据范围1≤n≤100000输入样例:53 1 2 4 5输出样例:1 2 3 4 5解法分而治之一个优美的思路:左边一个指针i,右边一个指针j保证指针 i 左边的值都比x要原创 2020-09-28 10:42:38 · 230 阅读 · 0 评论 -
快排模板
/*指针两边中间靠靠不动为止还没遇上:交换遇上:完事*/#include<iostream>using namespace std;const int N = 1e6 + 10;int n;int q[N];// 快排的模板void quick_sort(int q[],int l,int r){ if(l >= r) return; int x = q[l + r >> 1],i = l - 1,j = r +原创 2020-09-23 21:54:14 · 694 阅读 · 0 评论 -
算法学习——数论
目录1. 等差数列题目输入格式输出格式数据范围输入样例:输出样例:样例解释分析代码2.X的因子链题目输入格式输出格式数据范围输入样例:输出样例:分析代码1. 等差数列题目数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中 N 个整数。现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?输入格式输入的第一行包含一个整数 N。第二行包含 N 个整数 A1,A2,⋅⋅⋅,AN。(注意 A1∼AN 并不一定是按等差数列中的顺序给出)输出原创 2020-08-27 10:32:54 · 154 阅读 · 0 评论 -
算法学习——数论——线性筛法求素数
目录1.解决问题2.代码1.解决问题以O(n)的时间复杂度求出n以内的所有的质数2.代码int primes[N],cnt; //存放所有的质数bool st[N]; //当前的数有没有被筛选过int get_peimes(int n){ for(int i = 2;i <= n;i++) { if(!st[i]) primes[cnt++] = i; for(int j = 0;primes[j] * i <= n;j++)原创 2020-08-23 11:50:36 · 127 阅读 · 0 评论 -
算法学习——贪心
目录1.股票买卖II题目输入格式输出格式数据范围输入样例1:输出样例1:输入样例2:输出样例2:输入样例3:输出样例3:分析代码2.货舱选址题目输入格式输出格式数据范围输入样例:输出样例:分析代码3. 糖果传递题目输入格式输出格式数据范围输入样例:输出样例:分析代码4. 雷达设备题目输入格式输出格式数据范围输入样例:输出样例:分析代码1.股票买卖II题目给定一个长度为 N 的数组,数组中的第 i 个数字表示一个给定股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多原创 2020-08-22 12:10:09 · 566 阅读 · 0 评论 -
算法学习——双指针,BFS,图论
目录1.日志统计题目输入格式输出格式数据范围输入样例:输出样例:分析代码2. 献给阿尔吉侬的花束题目输入格式输出格式数据范围输入样例:输出样例:分析代码1.日志统计题目小明维护着一个程序员论坛。现在他收集了一份”点赞”日志,日志共有 N 行。其中每一行的格式是:ts id表示在 ts 时刻编号 id 的帖子收到一个”赞”。现在小明想统计有哪些帖子曾经是”热帖”。如果一个帖子曾在任意一个长度为 D 的时间段内收到不少于 K 个赞,小明就认为这个帖子曾是”热帖”。具体来说,如果存在某个时刻 T原创 2020-08-17 12:05:49 · 283 阅读 · 0 评论 -
算法学习——树状数组和线段树
目录1.动态求连续区间和题目输入格式输出格式数据范围输入样例:输出样例:分析1.动态求连续区间和题目给定 n 个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,b] 的连续和。输入格式第一行包含两个整数 n 和 m,分别表示数的个数和操作次数。第二行包含 n 个整数,表示完整数列。接下来 m 行,每行包含三个整数 k,a,b (k=0,表示求子数列[a,b]的和;k=1,表示第 a 个数加 b)。数列从 1 开始计数。输出格式输出若干行数字,表示 k=0 时,对应原创 2020-08-13 11:21:18 · 278 阅读 · 0 评论 -
线段树的区间操作——板
区间操作struct node { int l,r,sum,lazy;} tr[maxn<<2]; //节点类型void pushup(int m) { //某个值的向上更新 tr[m].sum=tr[m<<1].sum+tr[m<<1|1].sum;}void build(int m,int l,int r) {//建树 tr[m].l=l; tr[m].r=r; tr[m].lazy=0; //lazy初始化为0 i原创 2020-07-20 23:10:50 · 109 阅读 · 0 评论 -
树状数组与线段树问题——基本原理
目录树状数组与线段树的关系树状数组1.核心应用树状数组与线段树的关系树状数组1.核心应用快速求前缀和原创 2020-07-12 09:58:36 · 199 阅读 · 0 评论 -
十一届蓝桥杯(7月)
目录1.走方格题目输入格式输出格式数据范围输入样例1:输出样例1:输入样例2:输出样例2:DP代码分析1.走方格题目在平面上有一些二维的点阵。这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n 行,从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。现在有个人站在第 1 行第 1 列,要走到第 n 行第 m 列。只能向右或者向下走。注意,如果行号和列数都是偶数,不能走入这一格中。问有多少种方案。输入格式输入一行包含两个整数 n,m。输出格式输出一个整数原创 2020-07-10 18:44:19 · 859 阅读 · 0 评论 -
算法学习——枚举、模拟与排序
目录1.连号区间数题目输入格式输出格式数据范围输入样例1:输出样例1:输入样例2:输出样例2:分析代码1.连号区间数题目小明这些天一直在思考这样一个奇怪而有趣的问题:在 1∼N 的某个排列中有多少个连号区间呢?这里所说的连号区间的定义是:如果区间 [L,R] 里的所有元素(即此排列的第 L 个到第 R 个元素)递增排序后能得到一个长度为 R−L+1 的“连续”数列,则称这个区间连号区间。当 N 很小的时候,小明可以很快地算出答案,但是当 N 变大的时候,问题就不是那么简单了,现在小明需要你的帮原创 2020-07-02 21:28:01 · 323 阅读 · 0 评论 -
模板——归并排序
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;const int N = 1000010;int q[N],tmp[N];void merge_sort(int q[],int l,int r){ if(l >= r) return; int mid = l + r >>原创 2020-06-26 17:32:07 · 112 阅读 · 0 评论 -
模板——判断一个8位数是不是日期
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;int months[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};//判断是不是日期bool check(int date){ int year = date / 10000; int month原创 2020-06-26 17:10:43 · 1203 阅读 · 0 评论 -
算法学习——数学与简单DP
目录1.买不到的数目题目输入格式输出格式数据范围输入样例:输出样例:分析1.买不到的数目题目小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。输入格式两个正整数 n,m,表示每种包原创 2020-06-25 19:09:22 · 259 阅读 · 0 评论 -
算法学习 二分与前缀和
例题1 数的范围题目给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。如果数组中不存在该元素,则返回“-1 -1”。输入格式第一行包含整数n和q,表示数组长度和询问个数。第二行包含n个整数(均在1~10000范围内),表示完整数组。接下来q行,每行包含一个整数k,表示一个询问元素。输出格式共q行,每行包含两个整数,表示所求元素的起始位置和终止位置。如果数组中不存在该元素,则返回“-1 -1”。数据范围1原创 2020-06-22 16:58:03 · 619 阅读 · 0 评论 -
算法学习——前缀和的计算
分析——前缀和前缀和:求某一个静态数组的某一段的和原理:容斥原理公式:求子矩阵和的公式原创 2020-06-14 16:51:33 · 308 阅读 · 0 评论 -
算法学习——二分法
分析——二分1.确定区间,确定目标在区间当中2.找出一个性质,满足使得整个区间具有二段性1.离散的情况第一类ans在右端点:M就归于右边第一类模板while(L < R){ M = (L + R + 1) / 2; if M 是 绿 L = M; //根据这一步判断上一步需不需要 + 1 左边加一,右边不加 else R = M - 1;}第二类ans在左端点,M就归于左边第二类模板while原创 2020-06-14 16:23:00 · 253 阅读 · 0 评论 -
算法学习 二进制 lowbit函数
lowbit(x)是x的二进制表达式中最低位的1所对应的值(位置)。比如,6的二进制是110,所以lowbit(6)=2。最近回头看树状数组,发现关于lowbit()函数,目前有两种算法。第一种是比较常见的,也是我一直在用的:int lowbit(int x){ return x&(-x);}最近发现了另一种算法,如下所示:int lowbit(int x){ return x&(x^(x-1));}...原创 2020-05-08 17:55:09 · 1191 阅读 · 0 评论 -
算法学习(蓝AB) 递归和递推
目录例题1 递归实现指数型枚举题目输入格式输出格式数据范围输入样例:输出样例:代码例题2 递归实现排列型枚举题目输入格式输出格式数据范围输入样例:输出样例:代码例题3 简单斐波那契题目输入格式输出格式数据范围输入样例:输出样例:代码例题4 费解的开关题目输入格式输出格式数据范围输入样例:输出样例:代码例题5 递归实现组合性枚举题目输入格式输出格式数据范围输入样例:输出样例:递归实现代码非递归实现代码例题6 带分数题目输入格式输出格式数据范围输入样例1:输出样例1:输入样例2:输出样例2:代码例题1原创 2020-05-08 21:55:39 · 469 阅读 · 0 评论 -
算法学习笔记 村庄通电问题 prime算法
目录prime算法详解 最小生成树题目问题描述输入格式输出格式样例输入样例输出题解prime算法详解 最小生成树prime算法详解题目问题描述2015年,全中国实现了户户通电。作为一名电力建设者,小明正在帮助一带一路上的国家通电。 这一次,小明要帮助 n 个村庄通电,其中 1 号村庄正好可以建立一个发电站,所发的电足够所有村庄使用。 现在,这 n 个村庄之间都没有电线相连,小明主...原创 2020-05-05 18:42:24 · 473 阅读 · 0 评论 -
算法学习笔记 疑难杂题 模拟散列表
目录哈希表分类哈希函数解决冲突的方法拉链法开放寻址法题目题输入输出拉链法开放寻址法哈希表分类哈希函数一般直接取模解决冲突的方法开放寻址法拉链法拉链法算法题里面一般只有添加和查找开放寻址法一般只开一个数组,但是一般要开到数组长度的2 - 3 倍题目题输入输出拉链法#include<bits/stdc++.h>using name...原创 2020-05-05 12:41:40 · 139 阅读 · 0 评论 -
单链表的插入操作
插入void insert(int x) //把x插入到K点上面{ e[idx] = x; ne[idx] = h[k]; h[k] = idx++;}原创 2020-05-05 11:58:23 · 781 阅读 · 0 评论 -
acwing 疑难杂题 组合数问题(数论)
目录题目题输入 输出思路一个范围求二维 的前缀和二维前缀和公式如何快速求一个组合数是否能整除k?组合数的递推式代码题目题输入 输出思路一个范围求二维 的前缀和二维前缀和公式如何快速求一个组合数是否能整除k?组合数的递推式代码#include<cstdio>#include<cstring>#include<algorithm>...原创 2020-05-05 11:25:11 · 200 阅读 · 0 评论 -
acwing算法学习——疑难杂题——剪格子
目录题目分析题目分析原创 2020-05-04 17:43:03 · 211 阅读 · 0 评论 -
求树两个节点两个节点的最近公共父节点
int find(int x){ if (p[x] != x) p[x] = find(p[x]); return p[x];}void tarjan(int u){ st[u] = 1; for (int i = h[u]; ~i; i = ne[i]) { int j = e[i]; if (!st[j]) ...原创 2020-05-04 17:09:04 · 403 阅读 · 0 评论 -
疑难杂题——距离(LCA)
题目给出 n 个点的一棵树,多次询问两点之间的最短距离。注意:边是无向的。所有节点的编号是 1,2,…,n。输入格式第一行为两个整数 n 和 m。n 表示点数,m 表示询问次数;下来 n−1 行,每行三个整数 x,y,k,表示点 x 和点 y 之间存在一条边长度为 k;再接下来 m 行,每行两个整数 x,y,表示询问点 x 到点 y 的最短距离。树中结点编号从 1 到 n。输出...原创 2020-05-04 17:06:26 · 678 阅读 · 0 评论 -
疑难杂题笔记——斐波那契
来源:https://www.acwing.com/problem/content/1215/题目斐波那契数列大家都非常熟悉。它的定义是:f(x)=1…(x=1,2)f(x)=f(x−1)+f(x−2)…(x>2)对于给定的整数 n 和 m,我们希望求出:f(1)+f(2)+…+f(n) 的值。但这个值可能非常大,所以我们把它对 f(m) 取模。但这个数字依然很大,所以需要再...原创 2020-04-11 12:06:43 · 576 阅读 · 0 评论 -
算出斐波那契数列中的每一项的值(快速幂解法)
void mul(LL c[][2],LL a[][2],LL b[][2]) // c = a * b{ static LL t[2][2]; memset(t,0,sizeof t); for(int i = 0;i < 2;i++) for(int j = 0;j < 2;j++) for(int k ...原创 2020-04-11 11:30:50 · 306 阅读 · 0 评论 -
蓝桥杯注意事项
不能用 long long原创 2020-04-11 10:22:31 · 2372 阅读 · 1 评论 -
计算矩阵的乘法
原创 2020-04-11 10:05:04 · 193 阅读 · 0 评论 -
龟速乘法
来源:两个数字很大,想要相乘的时候会爆int ,存不下方法: 把乘法转换为加法LL qmul(LL a,LLb){ LL res = 0; while(b) { if(b & 1) res = res + a; a = a + a; b >> 1; } return res;}...原创 2020-04-11 10:00:33 · 195 阅读 · 0 评论 -
疑难杂题笔记——倍数问题
学习来源:https://www.acwing.com/video/795/题目众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。现在小葱给了你 n 个数,希望你从这 n 个数中找到三个数,使得这三个数的和是 K 的倍数,且这个和最大。数据保证一定有解。输入格式第一行包括 2 个正整数 n, K。第二行 n...原创 2020-04-09 21:44:20 · 462 阅读 · 0 评论 -
C++写取模所存在的问题以及解决的方案
问题在C++ 当中,取模与我们正常意义上的取模有差距,负数取模 是负数解决的方案//求 x 对 k 的取模的过程 ( x % k + k) % k; //多一个 + k 的过程...原创 2020-04-09 21:08:46 · 564 阅读 · 0 评论 -
并查集学习笔记
定义步骤路径压缩算法原创 2020-04-09 07:56:01 · 114 阅读 · 0 评论 -
疑难杂题笔记——修改数组
题目给定一个长度为 N 的数组 A=[A1,A2,⋅⋅⋅AN],数组中有可能有重复出现的整数。现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改 A2,A3,⋅⋅⋅,AN。当修改 Ai 时,小明会检查 Ai 是否在 A1∼Ai−1 中出现过。如果出现过,则小明会给 Ai 加上 1;如果新的 Ai 仍在之前出现过,小明会持续给 Ai 加 1,直到 Ai 没有在 A1∼Ai−1...原创 2020-04-05 17:53:21 · 859 阅读 · 0 评论 -
复杂DP习题——垒骰子
垒骰子赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。atm想计算一下有多少种不同的可能的垒骰子方式。两种垒骰子方式相...原创 2020-04-05 16:11:12 · 317 阅读 · 1 评论 -
快速幂算法模板
快速幂算法for(int k = n - 1;k;k >>= 1) //快速幂算法 { if(k & 1) mul(f,f,a); //f = f * a mul(a,a,a); //a = a * a }原创 2020-04-05 15:58:56 · 84 阅读 · 0 评论 -
计算矩阵乘法的模板
矩阵乘法// C = A * Bvoid mul(int c[][N],int a[][N],int b[][N]) { static int t[N][N]; //作为一个临时的数组 memset(t,0,sizeof t); //先清空 for(int i = 0;i < N;i++) //三次循环 for(int j = 0;j &...原创 2020-04-05 15:46:15 · 226 阅读 · 0 评论