acwing菜鸟闯关记(二)

单链表

struct Node
{int date;struct Node * next
}new Node()

单链表源数据结构如代码。
运用数组模拟单链表速度更快。

void init(){//初始化head = -1;idx = 0;
}void add_to_head(int val){//加到头节点后e[idx] = val;ne[idx] = head;head = idx;idx ++;
}void add(int val,int k){//加到k节点后e[idx] = val;ne[idx] = ne[k];ne[k] = idx;idx++;
}void remove(int k){//移除k节点ne[k] = ne[ne[k]];
}

思路:e[]表示值,ne[]表示下一节点。

双链表

void init(){//0左端点,1右端点r[0] = 1;l[1] = 0;idx = 2;
}
//下标k右边插入x
void add(int k ,int x){e[idx] = x;r[idx] = r[k];l[idx] = k;l[r[k]] = idx;//先后顺序r[k] = idx;idx++;
}
//左边插入调用 add(l[k],x)
//删除第k个
void remove(int k){r[l[k]] = r[k];l[r[k]] = l[k];
}

模拟栈

int m;
const int N = 100010;int stk[N],tt = 0;//插入
stk[++ tt] == x;
//弹出
tt --;
//判断是否为空
if(tt >0) not empty
else empty
//栈顶
cout<<stl[tt];

栈用数组,最高位就是栈顶。数组覆盖与数组往上加。

模拟队列

/** 队尾插入元素* 队头hh,队尾tt*/
int q[N],hh,tt = -1;
//进队列
q[++tt] = x;
//弹出
hh++;
//判空
if(hh <= tt)    not empty
else empty
//队头
cout<<q[hh];

单调栈

栈中元素按照递增或者递减顺序排列。每个元素只会进栈一次,进栈时会把破坏单调性的栈内元素弹出。

 while(tt && stk[tt]>=x) tt--;if (tt) cout<<stk[tt]<<" ";else    cout<<"-1"<<" ";stk[++tt] = x;

单调队列

滑动窗口,维护一个双向队列,遍历序列,仅当一个元素可能成为某个区间最值时才保留它。

int hh = 0,tt = -1;
for (int i = 0; i < n; ++i) {if (hh<=tt&&q[hh]<i-k+1)    hh++;while(hh<=tt && a[q[tt]] >= a[i])   tt--;q[++tt] = i;if (i>=k-1) cout<<a[q[hh]]<<" ";
}

KMP

//构建next数组
//i是用来扫描后缀的,j是用来扫描前缀
for(int i = 2,j = 0;i <= n;i++)
{while(j && p[i] != p[j + 1])j = ne[j];//当前后缀不匹配时,就查表,往前跳,直到匹配为止if(p[i] == p[j + 1])j++;//匹配j就加1ne[i] = j;//存下来
}
//寻找匹配值
for(int i = 1,j = 0;i <= m;i++)
{// 当j为0或者不匹配时,就往前跳,而跳的位置需要查上一位的next数组while(j && s[i] != p[j + 1])j = ne[j];
//跳出while循环有两种,如果它们匹配的话,j就加1,再继续匹配if(s[i] == p[j + 1])j++;if(j == n){printf("%d ",i - n);//说明匹配成功了,输出下标j = ne[j];
//注意一定要执行这一步,因为不知道字符串后面还有没有可以匹配的,否则就会不动了}
}

Trie树

const int N = 1000010;
int son[N][26],cnt[N],idx;//son子节点,最多连26条边
// cnt为以当前这个点为结尾的单词有多少个,
// idx 存当前用到了哪个下标
// 下标为0的点,又是根节点又是空节点
//全局变量不定义就是0
char str[N];
void insert(char str[])
{int p = 0;//p就是一个指针,刚开始指向root//由于字符串结尾是"\0",可以通过str[i]来判断是否到字符串末尾for(int i = 0;str[i];i++){int u = str[i] - 'a';//得到元素//判断节点是否有此元素,如果没有就创建一个if(!son[p][u])son[p][u] = ++idx;//给节点编号p = son[p][u];//指向子节点}cnt[p]++;//以这个字符结束的单词次数加1,即给单词做标记
}int query(char str[])
{int p = 0;//同样的,刚开始指向rootfor(int i = 0;str[i];i++)// 判断是否到字符串末尾{int u = str[i] - 'a';// 得到要查询的节点//遍历树,如果没有此节点说明单词不存在if(!son[p][u])return 0;p = son[p][u];//有这个节点的话,就令p指向这个节点,然后看看这个节点下面是否有下一个元素的节点}return cnt[p];//返回单词出现次数
}

最大异或对

^为位异或

void insert(int x){int p = 0;for (int i = 30; i>=0; i--) {//i>=0 等价于~iint &s = son[p][x>>i&1];//取X的第i位的二进制数是什么  x>>k&1(前面的模板)if (!s) s = ++idx;p = s;}
}
int query(int x){int res = 0,p = 0;for (int i = 30; i >=0 ; i--) {int s = x >> i & 1;if (son[p][!s]){res+= 1<<i;//第i位变1,也就是加上高位1;res =res*2+1p = son[p][!s];}else{//            res += 0 <<i;//可省略  res = res*2+0p = son[p][s];}}return res;
}

并查集

1、合并两个集合-----》father接father
2、查询两个元素是否在一个集合-----》father是否一样
时间复杂度近似O(1)

const int N = 100010;
int n,m;
int p[N],d[N];//d[N]为到根节点距离
//查询x的祖宗节点 + 路径压缩
int find(int x){if (p[x] != x){int t = find(p[x]);d[x] += d[p[x]];p[x] = t;}return p[x];
}

堆排序

是最高效的优先级队列。堆通常是一个可以被看做一棵完全二叉树的数组对象。
手写堆的的常用操作有几个

  1. 插入一个数
  2. 求集合当中的最小值
  3. 删除最小值
  4. 删除任意一个元素
  5. 修改任意一个元素

堆是用一个一维数组存储的,根节点存到下标为1的位置,节点的左儿子存到下标为2x的位置;右儿子存到下标为2x+1的位置。
小根堆性质:父节点比它的左右儿子的值小。
down操作

void down(int x){//注意变量  不能改变,变了就坏了int t = x;if (x * 2 <=hsize && h[x*2] <h[t] ) t = x*2;if (x * 2+1 <=hsize && h[x*2+1] <h[t] ) t = x*2+1;if (x!=t){swap(h[x],h[t]);down(t);}
}

up操作

void up(int x){//注意变量  不能改变,变了就坏了while (x/2 && h[x/2]>h[x]){swap(x/2,x);x/=2;}
}

heap[size]为数组最后一个元素;
heap[1]为根节点

哈希

哈希表最主要的作用把一个比较庞大的空间/值域映射到比较小的空间。
第一种为开放寻址法。
数组最好取质数。

//查找坑位
int query(int x){int k = (x%N+N)%N;while(h[k]!=null &&h[k]!=x){k++;if (k == N) k = 0;}return k;
}if (op[0] == 'I'){//插入int k = query(x);h[k] = x;}else{//查找int k = query(x);if (h[k]!=null)    puts("Yes");else puts("No");}

第二种为拉链法。

void insert(int x){//插入,单链表int k = (x%N+N)%N;e[idx] = x;ne[idx] = h[k];h[k] = idx;idx++;
}bool query(int x){int k = (x%N+N)%N;//查询for (int i = h[k]; i != -1 ; i = ne[i]) {if (e[i] == x)  return true;}return false;
}memset(h,-1,sizeof h);//初始化

字符串哈希
本质上是前缀和与权值相加结合。
P一般取131或13331,数组取质数

//前缀和求差
int n,m;
char str[N];
ULL h[N],p[N];
ULL get(int l,int r){return h[r] - h[l-1]*p[r-l+1];
}
//构造前缀和
for (int i = 1; i <= n; ++i) {p[i] = p[i-1] * P;h[i] = h[i-1]*P + str[i];
}

加油!拼搏百天!
HEBUT 作者:陈冰yunshangjin
邮箱:suchenbin@163.com 可以发邮件进行交流

acwing菜鸟闯关记(二)相关推荐

  1. 《JavaScript 闯关记》

    为何写作此课程 stone 主要负责基于 Web 的企业内部管理系统的开发,虽然能够熟练地使用 JavaScript,但随着对 JavaScript 的理解越来越深,才发现自己尚未掌握其精髓. 201 ...

  2. 一文解析|首个上榜科创板的机器人企业,江苏北人“闯关记”

    来源:机器人大讲堂 摘要:随着上交所公布了科创板首批受理上市申请的企业名单,这九家企业的每一家都被拿到放大镜下细细观察,评头论足.而其中,江苏北人作为登上科创版的首家机器人企业似乎受到的关注最多. 江 ...

  3. c语言闯关考试题讲解,程序员面试闯关(二):数据结构考点与细节分析

    上一篇文章程序员面试闯关(一):字符串匹配+排序+查找列举说明了各种常见的排序算法等算法基础,这里,主要分析下数据结构相关的基础和注意点. 一.线性表 1. 数组(顺序存储结构) 效率分析 查找:O( ...

  4. 上传漏洞学习——upload-labs 闯关(二)

    文章目录 前言: Less-11(get型 %00截断) Less-12(post型 00截断) Less-13(图片马绕过) Less-14(getimagesize检测) Less-15(exif ...

  5. 2018春招前端面试: 闯关记(精排精校) | 掘金技术征文

    前言 年末研发组解散失业, 选择回去学车了,也顺利拿到了驾照,最近回归大深圳,开始踏上漫漫的找工作之路. 拉勾上吊一百年不匹配, BOSS直聘日夜没反应. 题目范围涵盖我最近遇到的笔试题和面谈的(CS ...

  6. 2019春招前端面试: 闯关记(精排精校)

    前言 去年年末研发组解散失业, so选择回去学车了,也顺利拿到了驾照 最近回归大深圳....开始踏上漫漫的找工作之路; "拉勾上吊一百年不匹配!!!","BOSS直聘日夜 ...

  7. 《JavaScript 闯关记》之函数

    函数是一段代码,它只定义一次,但可以被执行或调用任意次.在 JavaScript 里,函数即对象,程序可以随意操控它们.比如,可以把函数赋值给变量,或者作为参数传递给其他函数,也可以给它们设置属性,甚 ...

  8. 《JavaScript 闯关记》之原型及原型链

    原型链是一种机制,指的是 JavaScript 每个对象都有一个内置的 __proto__ 属性指向创建它的构造函数的 prototype(原型)属性.原型链的作用是为了实现对象的继承,要理解原型链, ...

  9. 《JavaScript 闯关记》之简介

    简介 JavaScript 是面向 Web 的编程语言,绝大多数现代网站都使用了 JavaScript,并且所有的现代 Web 浏览器(电脑,手机,平板)均包含了 JavaScript 解释器. 这使 ...

  10. [LeetCode解题报告] LCP 49. 环形闯关游戏

    [LeetCode解题报告] LCP 49. 环形闯关游戏 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 四. 参考链接 ...

最新文章

  1. 硬件工程师必备秘籍,模拟电子经典200问!
  2. c++ege为什么直线画不出来_今天让我们来练习画一款椭圆茶几
  3. 【No.9 内存泄漏了么】
  4. MySql The service could not be started
  5. python股票分析系统_熬了一晚上,小白用Python写了一个股票提醒系统
  6. ejb 2.0 3.0_定义EJB 3.1视图(本地,远程,无接口)
  7. Spring MVC错误处理流程
  8. R语言信用评分卡:探索性数据分析
  9. 并发相关随笔(持续更新)
  10. CV领域的实验室及研究组
  11. 电商产品设计:后台商品管理设计
  12. vue+element PC系统自适应
  13. m3u8转换到mp4 python_python实现m3u8格式转换为mp4视频格式
  14. linux获取时间戳精确到毫秒,微妙
  15. html中iframe显示多个子页面
  16. 再见ip.taobao,全网显示 IP 归属地,用上这个开源库,实现也太简单了!
  17. 阮小五动问道 江民杀毒软件
  18. 四省联考圆锥曲线解答
  19. node.js的安装包 14.17版本
  20. [免费专栏] Android安全之APK逆向入门介绍

热门文章

  1. SSRF常见绕过思路
  2. 【踩坑】一行指令解决docker Error response from daemon: cannot stop container
  3. mysql默认join是什么类型_理解 SQL 中的各类 JOIN
  4. 设计模式翻译白话转载
  5. 城市桥梁道路管理系统 毕业设计 JAVA+Vue+SpringBoot+MySQL
  6. python爬虫爬取天气预报信息
  7. spring+mvc+mybatis实现微信支付宝等多平台合一的二维码支付
  8. TIKZ画FJSP中的甘特图-Trans必备
  9. php 智能表单系统,Html的智能表单
  10. AI摄影标杆仍在,AI摄像的新宇宙又被HUAWEI Mate20悄悄打开了