Edit: 逆天,用LinkedList不就行了嘛?🤣👉

算法要deque 搞单调队列,自己写一个记在这里

  • DequeNode 双向队列节点

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class DequeNode<T> 
    {
    public T val;
    public DequeNode<T> next;
    public DequeNode<T> pre;
    public DequeNode(T value = default(T), DequeNode<T> net = null, DequeNode<T> pr = null)
    {
    val = value;
    next = net;
    pre = pr;
    }

    }

  • Deque 双向队列

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    public class Deque<T> 
    {

    public int Count;
    private DequeNode<T> Front;
    private DequeNode<T> Back;

    public Deque()
    {
    Count = 0;
    Front = new DequeNode<T>();
    Back = new DequeNode<T>();
    Front.next = Back;
    Back.pre = Front;
    }
    public T PeekFront
    {
    get
    {
    if (Count == 0)
    throw new InvalidOperationException();
    return Front.next.val;
    }
    }

    public T PeekBack
    {
    get
    {
    if (Count == 0)
    throw new InvalidOperationException();
    return Back.pre.val;
    }
    }

    public void PushFront(T value)
    {
    Count++;
    DequeNode<T> n = new DequeNode<T>(value, Front.next, Front);
    Front.next = n;
    n.next.pre = n;
    }
    public void PushBack(T value)
    {
    Count++;
    DequeNode<T> n = new DequeNode<T>(value, Back, Back.pre);
    Back.pre = n;
    n.pre.next = n;
    }
    public T PopFront()
    {
    if (Count == 0) throw new InvalidOperationException();
    Count--;
    var node = Front.next;
    node.next.pre = Front;
    Front.next = node.next;
    return node.val;
    }
    public T PopBack()
    {
    if (Count == 0) throw new InvalidOperationException();
    Count--;
    var node = Back.pre;
    Back.pre = node.pre;
    node.pre.next = Back;
    return node.val;

    }
    }
  • MonotoneQue 单调递增队列

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class MonotoneQue<T> where T :IComparable
    {
    private Deque<T> deque=new Deque<T> ();
    public T Front => deque.PeekFront;

    public void Pop(T value)
    {
    if(deque.Count!=0&& value.Equals(deque.PeekFront))
    {
    deque.PopFront();
    }
    }

    public void Push(T value)
    {

    while (deque.Count != 0 && value.CompareTo(deque.PeekBack) > 0)
    deque.PopBack();
    deque.PushBack(value);
    }
    }

  • 数组实现也可以

  • 迭代器TOO LAZY TO EDIT