
算法基础课
文章平均质量分 76
balbala
码畜也有梦想
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
第六章贪心(二)
本节目录1. 排序不等式2. 绝对值不等式3. 推公式 1. 排序不等式 例题:913.排队打水 有 n 个人排队到 1 个水龙头处打水,第 i 个人装满水桶所需的时间是 ti,请问如何安排他们的打水顺序才能使所有人的等待时间之和最小? 输入格式 第一行包含整数 n 。 第二行包含 n 个整数,其中第 i 个整数表示第 i 个人装满水桶所花费的时间 ti。 输出格式 输出一个整数,表示最小的等待时间之和。 数据范围 1<=n<=105 1<=ti<=104 输入样例: 7 3 6 1原创 2020-05-10 10:04:02 · 228 阅读 · 0 评论 -
第六章贪心(一)
本节目录1. 区间问题2. Huffman树 1. 区间问题 例题:905. 区间选点 给定 N 个闭区间[ai, bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式 第一行包含整数N,表示区间数。 接下来N行,每行包含两个整数ai ,bi ,表示一个区间的两个端点。 输出格式 输出一个整数,表示所需点的最小数量。 数据范围 1<=N<=105 , -109 <= ai <= bi <原创 2020-05-09 15:10:26 · 165 阅读 · 0 评论 -
第五章动态规划(三)
本节目录1. 数位统计DP2. 状态压缩DP3. 树形DP4. 记忆化搜索 1. 数位统计DP 例题:338. 计数问题 本题最重要的是分情况讨论! 实现一个 count(n, x) 函数,功能是计算 1–n 中 x 的出现次数。 则区间 [a, b] 中 x 的出现次数 = count(b, x) - count(a, x) 例如: 边界: 当x=0的时候直接跳过第一次循环 (i=n-1-!x) 当i为首位时不需计算前面的数(if(i<n-1)) 2. 状态压缩DP 例题:291. 蒙德里安原创 2020-05-08 19:54:30 · 201 阅读 · 0 评论 -
第五章动态规划(二)
本节目录1. 线性DP2. 区间DP 1. 线性DP 递推顺序是线性的 例题:898. 数字三角形 因为涉及到 i-1,所以下标从 1 开始。 import java.util.Scanner; public class Main { static int N = 510; static int n; static int[][] a = new int[N][N]; static i...原创 2020-05-07 14:23:49 · 206 阅读 · 0 评论 -
第五章动态规划(一)
本节目录1.背包问题 1.背包问题 (1)01背包:每件物品最多只用一次 (2)完全背包:每种物品有无限个 (3)多重背包:每种物品最多有Si个 (4)分组背包:物品分为N组,每一组有若干个物品,每一组只能选一件物品 例题:2. 01背包问题 ——————————————————————————————————————————————————— 闫氏DP分析法: 解析:一件物品只有选和不选两种...原创 2020-05-07 12:36:09 · 169 阅读 · 0 评论 -
第四周习题课
845. 八数码 最小步数----BFS 整个九宫格算作一个状态,如果一个状态 A 通过交换一次到达另一个状态 B,我们就在 A—B 连一条边,权重为1,现在就是给了你初始状态,问能不能到最终状态,能的话最少需要几步,不能输入-1。 本题: (1)状态表示比较复杂 我们用长为 9 的字符串表示整个九宫格,如何求这个字符串交换一次之后的新状态呢? 先把这个字符串恢复成 3x3 的格式,再交换,再转...原创 2020-05-06 17:01:25 · 172 阅读 · 0 评论 -
第四章数学知识(四)
本节目录1.容斥原理2.博弈论 1.容斥原理 例题:890. 能被整除的数 如果暴力枚举的话肯定会超时,用容斥原理做。 以样例为例: 定义集合: S2:1—10中所有能被 2 整除的数,也就是 2 的倍数的集合 {2,4,6,8,10} S3:1—10中所有能被 3 整除的数,也就是 3 的倍数的集合 {3,6,9} 我们要求的就是 |S2∪S3| = |S1| + |S2| - |S2 ∩S...原创 2020-05-06 14:03:06 · 343 阅读 · 0 评论 -
第四章数学知识(三)
本节目录1. 高斯消元 1. 高斯消元 可以在 O(n3) 内解决 n 个方程 n 个未知数的多元线性方程组。解有三种情况:无解,无穷多组解,唯一解。 例题:883. 高斯消元解线性方程组 初等行列变换: 1.把某一行乘以一个非零的数 2.交换某两行 3.把某一行的若干倍加到另一行上 怎么判定是无解,无穷解还是唯一解呢? (1)如果可以转换为完美上三角矩阵,就是唯一解。 完美上三角矩阵: 第一...原创 2020-05-05 14:38:07 · 208 阅读 · 0 评论 -
第四章数学知识(二)
本节目录1. 欧拉函数 1. 欧拉函数 例题:873. 欧拉函数 其实就是在分解质因数的过程中求出每个质因数 Pi,用 N / Pi * (Pi - 1),Pi 是质因数,所以一定可以整除 import java.util.Scanner; public class Main { static int n; public static void main(String[] args) ...原创 2020-05-04 17:58:28 · 185 阅读 · 1 评论 -
第四章数学知识(一)
本节目录1.质数1.1质数的判定--试除法 O(sqrt(n))1.2 分解质因数---试除法 O(sqrt(n))1.3 筛质数2.约数2.1 试除法求一个数的所有约数2.2 约数个数2.3 约数之和2.4 欧几里得算法 1.质数 质数是针对所有 >1 的自然数定义的。 质数:在大于1 的整数中,如果只包含 1 和本身这两个约数,就被称为质数,或素数。 1.1质数的判定–试除法 O(sqr...原创 2020-05-04 12:13:21 · 168 阅读 · 0 评论 -
第三章搜索与图论(三)
最小生成树 本节课大纲: 一般都是无向图的最小生成树 Prim 算法和 Dijkstra 算法很像 如果是稠密图,一般选择朴素版 Prim,因为代码短,稀疏图一般用克鲁斯卡尔算法。 堆优化的 Prim 的优化方式和 Dijkstra 一样的,而且很少用到,所以不讲了。 朴素版Prim 集合 st:存储当前已经在连通块中的点。 步骤: (1)初始化所有点到集合的距离,所有点 dist[i] = 正...原创 2020-05-03 15:54:22 · 309 阅读 · 0 评论 -
第三章搜索与图论(二)
最短路 无向图和有向图的最短路没有区别,因为无向图就是特殊一点的有向图,连两次边就可以了。 权重存在子节点上 主要分为两类:(源点就是起点,汇点就是终点) 单源点最短路:求一个点到其他所有点的最短距离,又分为所有边权都是正数和存在负权边两种情况。 多源汇最短路:求一个点到另一个点的最短距离(起点和终点都不确定) n 是点的数量,m 是边的数量。 如果 m 和 n2 一个级别----稠密图,邻接...原创 2020-05-02 21:18:47 · 328 阅读 · 0 评论 -
第三章搜索与图论(一)
DFS 与 BFS 使用的数据结构 空间 特点 DFS 栈 O(n) 不具有最短性 BFS 队列 O(2n) 最短路 例题:842. 排列数字 ———————————————————————————————————————————————————— 和94题一样啊… 依次枚举每个位置放哪个数 import java.util.Scanner; public class...原创 2020-05-01 11:13:49 · 294 阅读 · 0 评论 -
第二章习题
800. 数组元素的目标和 ———————————————————————————————————————————————— 思路:首先容易想到双重 for 暴力枚举,如何优化?利用单调性------双指针 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; p...原创 2020-04-30 23:44:04 · 177 阅读 · 0 评论 -
第二章(三)
哈希表 两个要素: 存储结构:开放寻址法和拉链法 字符串哈希方式 例题:840.模拟散列表 维护一个集合,支持如下几种操作: 1.“I x”,插入一个数 x; 2.“Q x”,询问数 x 是否在集合中出现过。 现在要进行 N 次操作,对于每个询问操作输出对应的结果。 输入格式 第一行包含整数N,表示操作数量。 接下来N行,每行包含一个操作指令,操作指令为"I x",“Q x"中的一种。 输出格...原创 2020-04-30 12:37:50 · 207 阅读 · 0 评论 -
第二章(二)
Trie树 高效的存储和查找字符串集合的数据结构。 例题:LeetCode–208. 实现 Trie (前缀树) —————————————————————————————————————————————————— class Trie { class TrieNode{ char val; boolean isWord; TrieNod...原创 2020-04-29 14:54:39 · 163 阅读 · 0 评论 -
第二章(一)
链表与邻接表 用数组模拟单链表和双链表(C++中这样做是为了减少new的使用,new太耗时了,但是java少不了new啊…),单链表最主要用的是邻接表,邻接表主要用于存储树和图。双链表主要用于优化某些问题。 每个链表节点都有 value 和 next,用 e[N] 表示节点 N 的值,ne[N] 表示节点 N 的next 指针指向的下一个节点编号。 例子: 例题:826.单链表 实现一个单链表,...原创 2020-04-28 13:27:09 · 217 阅读 · 0 评论 -
第一章习题课
786.第 K 个数 给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列的第 k 小的数是多少。 输入格式 第一行包含两个整数 n 和 k 。 第二行包含 n 个整数(所有整数均在1~109 范围内),表示整数数列。 输出格式 输出一个整数,表示第 k 小数。 数据范围 1<=n<=100000, 1<=k<=n 输入样例: 5 3 2 4 1 5 ...原创 2020-04-27 11:29:23 · 297 阅读 · 0 评论 -
第一章(三)
双指针 两大类: 1.两个指针指向同一个序列 2.两个指针指向不同的序列 通用模板: for(int i = 0, j = 0;i < n;i++){ //chechk()不一定要明写出来,它只是表示满足某种性质 while(i < j && check(i, j)) j++; //每道题目的具体逻辑 } 双指针最核心的用途就是优...原创 2020-04-26 14:02:16 · 170 阅读 · 0 评论 -
第一章(二)
高精度 高精度算法分为四类:+ - * / ,就是一个位数特别多的数与另一个数运算 A + B (大写表示位数特别多,比如100万位,小写表示正常的数) A - B A * a A / a (A * B 和 A / B 出现的非常少,不讲) java自带大数类,所以其实可以不学高精度算法,Python默认就是无限位,也不用学,C++就得自己实现 (1)大整数的存储 数组的第一位存个位数,高位的...原创 2020-04-24 13:00:05 · 269 阅读 · 0 评论 -
第一章(一)
快速排序----基于分治 步骤 (1)确定分界点 一般有三种方法: 取左端点:q[l] 取右端点:q[r] 取中间的数:q[(l+r) / 2] 也可以随机取个数 (2)调整区间(最难) 比如取了 x 这个数作为分界点,则把区间分为两部分:不一定等长 <=x 的在左边,>= x 的在右边 (3)递归处理左右两段 例题:785.快速排序 import java.io.Buffered...原创 2020-04-23 11:33:11 · 203 阅读 · 0 评论