LeetCode第1381题 - 设计一个支持增量操作的栈

题目

请你设计一个支持下述操作的栈。

实现自定义栈类 CustomStack :

  • CustomStack(int maxSize):用 maxSize 初始化对象,maxSize 是栈中最多能容纳的元素数量,栈在增长到 maxSize 之后则不支持 push 操作。
  • void push(int x):如果栈还未增长到 maxSize ,就将 x 添加到栈顶。
  • int pop():弹出栈顶元素,并返回栈顶的值,或栈为空时返回 -1 。
  • void inc(int k, int val):栈底的 k 个元素的值都增加 val 。如果栈中元素总数小于 k ,则栈中的所有元素都增加 val

解答

class CustomStack {
    private int maxSize = 0;
    private LinkedList<Integer> stack = new LinkedList<>();

    public CustomStack(int maxSize) {
        this.maxSize = maxSize;
    }

    public void push(int x) {
        if (stack.size() >= maxSize) {
            return;
        }

        stack.addLast(x);;
    }

    public int pop() {
        if (stack.isEmpty()) {
            return -1;
        }

        return stack.removeLast();
    }

    public void increment(int k, int val) {
        int count = stack.size();
        if (count > k) {
            count = k;
        }

        for (int i = 0; i < count; ++i) {
            int value = stack.get(i);
            value += val;
            stack.set(i, value);
        }
    }
}

要点
本题目实现的难度不大,只需要了解栈的基本定义,即可输出符合题目要求的代码,唯一的问题在于如何保证increment方法的运行效率。
当前给出的实现方案,基于LinkedList来存储数据,在列表的末尾增加或者删除元素,支持pushpop方法不是问题,时间复杂度均为O(1),这是由LinkedList实现特点保证的。
基于下标获取链表某指定元素的操作,时间复杂度为O(N),这是链表的特点决定的,和LinkedList的实现无关,因此在支持increment方法时效率比较低,因为每次均需要从头部开始扫描元素,才能得到指定位置的元素。

你可能感兴趣的:(LeetCode,leetcode,java)