内容
1.链表与邻接表 2.栈与队列 3.kmp 要非常快得 把代码默写出来 一个模板要好好儿理解于熟练 《记忆力和自制力》
一、链表
数组模拟构造 静态链表
1.单链表
#include<iostream>
using namespace std;
const int N = 100010;
int head,e[N],ne[N],idx;
void init(){
head = -1;
idx = 0;
}
void head_add(int x){
e[idx] = x;
ne[idx] = head;
head = idx;
idx++;
}
void add(int k,int x){
e[idx] = x,ne[idx] = ne[k],ne[k] = idx,idx++;
}
void remove(int k){
ne[k] = ne[ne[k]];
}
int main(){
return 0;
}
//链表的遍历办法!!! for(int i = head;i != -1;i = ne[i]){ cout<<e[i]<<" "; }
2.双链表
常用来做某些问题的优化
int m;
const int N = 100010;
int e[N],l[N],r[N],idx;
void init(){
r[0] = 1;
l[1] = 0;
idx = 2;
}
void add(int k,int x){
e[idx] = x;
r[idx] = r[k];
l[idx] = k;
l[r[k]] = idx;
r[k] = idx;
}
void remove(int k){
r[l[k]] = r[k];
l[r[k]] = l[k];
}
3.邻接表
就是n个 单链表 常,用来解决数和图的问题的。
二、栈和队列
1.栈
栈的操作要求
#include<iostream>
using namespace std;
const int N = 100010;
int stk[N],tt;
stk[++t]=x;
t--;
if(tt>0) notempty;
else empty
stk[tt];
2.队列
如图:
int q[N],hh = 0,tt=-1;
q[++t] = x;
hh++;
if(hh<=tt) notempty;
else empty;
q[hh];
单调栈和单调队列 (抽象但一共也没有几种题型) 用于优化
3.单调栈
#include <iostream>
using namespace std;
const int N =100010;
int stk[N],tt;
int main(){
int n;
cin>>n;
for(int i = 0; i < n;i++){
int x;
scanf("%d",&x);
while(tt&&stk[tt]>=x) tt--;
if(tt) printf("%d ",stk[tt]);
else printf("-1 ");
stk[++tt] = x;
}
return 0;
}
变单调 再求极值 求极值的时间就是O(1)了
4. 单调队列
(题目:滑动窗口) 思路: 当求最小时,当i>j且a[i]>a[j],a[i]一定不作为答案出现,于是我们可以得到一个上升序列
#include<iostream>
using namespace std;
const int N =1000010;
int n,k;
int a[N],q[N];
int main(){
scanf("%d%d",&n,&k);
int hh = 0,tt = -1;
for(int i = 0; i < n; i++) scanf("%d",&a[i]);
for(int i = 0; i < n;i++){
if(hh<=tt&&q[hh] <= i-k) hh++;
while(hh<=tt&&a[q[tt]]>=a[i]) tt--;
q[++tt] = i;
if(i >= k - 1) printf("%d ",a[q[hh]]);
}
puts("");
hh = 0, tt = -1;
for(int i = 0; i < n; i++){
if(hh<= tt && q[hh] <= i-k) hh++;
while(hh <= tt && a[q[tt]] <= a[i]) tt--;
q[++tt] = i;
if(i >= k-1) printf("%d ",a[q[hh]]);
}
return 0;
}
总结: 共同思路都是,首先用模拟栈和队列暴力的做法做出来,然后观察有哪些元素是不需要的,删掉不需要的元素得到单调的序列,(挖掘一些性质、可以把目光集中到比较少的状态里面,从而减少复杂度)。 即:单调 再找极值
三、KMP
KMP算法是一种改进的字符串匹配算法 KMP是三位大牛:D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的。其中第一位就是《计算机程序设计艺术》的作者!!
KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索。模式串就是关键字(接下来称它为P),如果它在一个主串(接下来称为T)中出现,就返回它的具体位置,否则返回-1(常用手段)。
题解1
题解2
|