一、线性结构

基础知识:

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从表中删除!

  启发:

    算最小值的有用元素即可,进而会形成一个递增序列,最小值就是对首元素。

  关键:

     窗口右移操作,使用链表储存窗口内的有用元素。

 

 

转载于:https://www.cnblogs.com/songacm/p/3323272.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值