acwing算法基础课+备战蓝桥杯
野鸭丁真
这个作者很懒,什么都没留下…
展开
-
蓝桥杯注意事项
如何表示一个很大的整数 long n=2021041820210418l;注意:要在数字后面加上l.原创 2022-03-18 10:14:33 · 379 阅读 · 1 评论 -
并查集Java实现
并查集代码实现:public class UnionFind { private int count; //记录连通分量,即块数多少 private int[]parent; //节点x的根节点是parent[x] public UnionFind(int n){ //一开始互不相通 this.count=n; //一开始,每个节点是自己的父节点 parent=new int[n]; ...原创 2022-02-23 10:59:38 · 312 阅读 · 2 评论 -
数据结构----堆
堆是一个完全二叉树。堆中每个节点大于或等于左右子节点(大根堆),小根堆相反。即大根堆最大元素在堆顶,小根堆最小元素在堆顶。堆使用数组存储堆常用于解决topK问题例题1:215. 数组中的第K个最大元素class Solution { public int findKthLargest(int[] nums, int k) { //小根堆size=k,则堆顶就是第k个大的元素。 Queue<Integer> qp=new Priori.原创 2022-02-21 22:36:41 · 243 阅读 · 0 评论 -
蓝桥杯2020大学B组省赛
1.门派制作import java.util.Scanner;// 1:无需package// 2: 类名必须Main, 不可修改public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //在此输入您的代码... int n=2020; int count=0; w.原创 2022-02-21 16:08:06 · 6738 阅读 · 0 评论 -
搜索与图论
DFS一般开辟一个visited数组记录是否走过。深度优先搜索一般使用栈来实现。int dfs(int u){ st[u] = true; // st[u] 表示点u已经被遍历过 for (int i = h[u]; i != -1; i = ne[i]) { int j = e[i]; if (!st[j]) dfs(j); }}BFSBFS常使用队列queue存储。向波纹一样一圈一圈出去。广度优先搜索一般使用原创 2022-02-20 20:55:26 · 112 阅读 · 0 评论 -
单调栈,单调队列
单调栈通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。在使用单调栈的时候首先要明确如下几点:1.单调栈里存放的元素是什么?可能是存放的数组的下标,也可能是存放的数组的元素。(建议还是存放数组的下标)2.单调栈里元素是递增呢? 还是递减呢?注意一下顺序为 从栈头到栈底的顺序。单调栈,栈内顺序要么从大到小 要么从小到大小tips:如何明确栈内顺序:首先定义一个栈。读题目,假设从左到右依次进栈,如果栈顶元素大于.原创 2022-02-15 11:33:31 · 238 阅读 · 0 评论 -
关于Deque,Queue的小tips
QueueQueue是单入单出的队列。1.构造一个Queue:Queue<String> queue = new LinkedList<String>();2.添加元素:queue.offer("a");3.返回第一个元素,并在队列中删除String str=queue.poll();4.遍历queue: for(String q : queue){ System.out.println(q); }原创 2022-02-13 16:03:35 · 303 阅读 · 0 评论 -
关于HashMap的小tips
HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。import java.util.HashMap; // 引入 HashMap 类常用:hashmap中不存在就添加,存在value值加1:map.put(i,map.getOrDefault(i,0)+1);//如果不存在key为1的键值对就添加,存在则对应的value值加1。建立哈希表 HashMap<Integer, String> Sites = new HashMap<Inte原创 2022-02-13 15:44:26 · 1713 阅读 · 0 评论 -
关于固定的滑动窗口小tips
438. 找到字符串中所有字母异位词原创 2022-02-11 14:25:07 · 261 阅读 · 0 评论 -
关于String,char数组,整数相互转换
对于字符串转为char数组 String s=new String("abcdefg"); System.out.println("字符串转为数组"+s.toCharArray());输出结果为:字符串转为数组[C@135fbaa4输出结果为字符串的地址。对于char数组转为字符串应当使用String.valueOf()不要使用toString() char[] arr=new char[]{'1','2','6','8','5'}; String原创 2022-02-11 13:38:50 · 186 阅读 · 0 评论 -
快速求得 a和 b 的最大公约数
「更相减损法」和「欧几里得算法」欧几里得算法 int gcd(int a, int b) { // 欧几里得算法 return b == 0 ? a : gcd(b, a % b); }更相减损法int gcd(int a, int b) { // 更相减损法 while (true) { if (a > b) a -= b; else if (a < b) b -= a; ...原创 2022-02-10 11:45:13 · 286 阅读 · 0 评论 -
链表(用数组模拟)
之所以不用new是因为new耗费空间单链表:这里使用的是数组模拟单链表// head存储链表头,e[]存储节点的值val,ne[]存储节点的next指针,idx表示当前用到了哪个节点int head, e[N], ne[N], idx;// 初始化void init(){ head = -1; idx = 0;}// 在链表头插入一个数avoid insert(int a){ e[idx] = a, ne[idx] = head, head.原创 2021-11-23 23:12:40 · 212 阅读 · 0 评论 -
离散化,合并区间(待补)
待补原创 2021-11-23 21:02:57 · 182 阅读 · 0 评论 -
位运算小节
例如10的二进制为:1010 n他的反码为:0101 ~n他的补码为:反码+1=0110 ~n+11.查看二进制表示下的第k位(从右往左):(n>>k)& 1 (k=0,1,2,3....)2.取出n在二进制表示下第0~k-1位(即后k位):n&((1<<k)-1)3.n在二进制表示下第k位取反:n^(1<<k)4.成对运算:(用于图论中邻接表边集的存储)当n为偶数时,n ^ 1等于n+1当n...原创 2021-11-23 20:39:38 · 483 阅读 · 0 评论 -
差分111
一维差分:给定数组A,B。有B[1]=A[1],B[l]=A[l]-A[l-1].则称B数组为A数组的差分数组,同时A数组是B数组的前缀和数组。即前缀和与差分是互逆运算。给A数组区间[l,r]每个数加上c,则其差分序列变化为B[l]加上c,B[r+1]减去c。将原序列的区间操作转化为差分序列的单点操作进行计算,降低难度。给区间[l, r]中的每个数加上c:B[l] += c, B[r + 1] -= c二维差分:二维差分的公式:a[i,j]为前缀和数组,p[i,j]为差分数原创 2021-11-23 17:37:55 · 57 阅读 · 0 评论 -
前缀和模板
一维前缀和若设a[i]为数组第i个元素,则s[i]为数组前i个元素之和。默认s[0]为0代表前0个元素和为0.所以一维前缀和模板为:S[i] = a[1] + a[2] + ... a[i]a[l] + ... + a[r] = S[r] - S[l - 1]s[i]代表前i个元素的和。二维前缀和1.若令单个点为A[i,j]。则S[i,j]=S[i-1,j]+S[i,j-1]-S[i-1][j-1]+A[i,j].S[i-1][j]代表红色加绿色部分,S[i,.原创 2021-11-23 10:55:48 · 583 阅读 · 0 评论 -
高精度模板
Java可以直接使用大数做:java大整数的用法_云华100的专栏-CSDN博客_java大整数用法1.高精度加法C++代码板子:// C = A + B, A >= 0, B >= 0vector<int> add(vector<int> &A, vector<int> &B){ if (A.size() < B.size()) return add(B, A); vector<int>原创 2021-11-23 10:05:57 · 498 阅读 · 0 评论 -
二分模板(整数和浮点数)
整数:模板一:int bsearch_1(int l, int r){ while (l < r) { int mid = l + r >> 1; if (check(mid)) r = mid; else l = mid + 1; } return l;}当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算m原创 2021-11-22 20:58:07 · 209 阅读 · 0 评论 -
快速排序和归并排序模板
快排模板:public static void quick_sort(int[] q,int l,int r){ if (l >= r) return;//数组长度为1或者0直接返回 int x = q[l+r>>1];//取中间值为参考 //Define positions of two pointers int i = l - 1; int j = r + 1; while (i原创 2021-11-22 20:31:31 · 344 阅读 · 0 评论