基础知识:
1.数组;
2.带头结点的双向链表:
---Head
---First
3.循环队列
例一:最小值问题
问题描述:
实现一个n个元素的线性表,每次可以修改其中一个元素,也可以询问闭区间[q,p]中元素的最小值。
(1<=n,m<=100000)
分析:
设块长L,则一共有n/L块;
维护数组B,保存每个块的最小值。
(每次修改元素的时候,重算x所在块的最小值,即更新B。)
例二:最接近的值:
问题描述:
给一个n个元素的线性表A,对于每个数Ai,找到它之前的数中,和它最接近的数。
分析:
法一:当每个数字表示的值较小的时候,可以使用数组来进保存:f[i]=1;之后向前向后寻找第一个值为1的数字即可;
法二: 先排序;
根据从小到大的顺序构造双向链表,从后往前依次计算C6,C5...等,每计算一个,将这个数字从当前链表中删除。
例三:移动窗口:
问题描述:
有一个长度为n的数组,还有一个k<=n的窗口,窗口一开始在最左边的位置,能看到1-k的元素,每次向右移动一个元素,
直到窗口的右边界达到数组的元素n。
分析:
分开考虑:
最小值:
当窗口内部为 2 3 5 4 的时候,则仍然保存5是不明智的,因为5会始终被4压制,只要4出现,则5就没必要继续存在。
那么,我们可以将5从表中删除!
启发:
算最小值的有用元素即可,进而会形成一个递增序列,最小值就是对首元素。
关键:
窗口右移操作,使用链表储存窗口内的有用元素。