leetcode
leetcode 1151 ~ 1200
K 次操作后最大化顶端元素

K 次操作后最大化顶端元素

难度:

标签:

题目描述

代码结果

运行时间: 36 ms, 内存: 29.6 MB


/*
 * 题目思路:
 * 1. 使用Java Stream API将数组转化为栈。
 * 2. 根据k的值决定操作类型,并维护一个暂存删除元素的列表。
 * 3. 如果k的值大于等于nums的长度,返回-1。
 * 4. 否则通过比较暂存的删除元素,找到最大值。
 */

import java.util.Stack;
import java.util.ArrayList;
import java.util.Arrays;

public class MaxStackTopStream {
    public int getMaxStackTopStream(int[] nums, int k) {
        if (k >= nums.length) return -1;
        Stack<Integer> stack = new Stack<>();
        ArrayList<Integer> removedElements = new ArrayList<>();
        Arrays.stream(nums).forEach(stack::push);
        for (int i = 0; i < k; i++) {
            if (!stack.isEmpty()) {
                removedElements.add(stack.pop());
            } else if (!removedElements.isEmpty()) {
                stack.push(removedElements.remove(removedElements.size() - 1));
            }
        }
        return stack.isEmpty() ? -1 : stack.peek();
    }

    public static void main(String[] args) {
        MaxStackTopStream mst = new MaxStackTopStream();
        System.out.println(mst.getMaxStackTopStream(new int[]{5,2,2,4,0,6}, 4)); // 输出: 5
        System.out.println(mst.getMaxStackTopStream(new int[]{2}, 1)); // 输出: -1
    }
}

解释

方法:

此题解是通过分析不同操作次数k和数组长度的关系,选择不同的策略来找出最大的栈顶元素。首先,如果数组只包含一个元素,则当k为奇数时,操作后栈一定为空(因为每次添加元素需要先有删除动作),返回-1;k为偶数时,可以通过删除和添加同一个元素来维持栈不变,返回该元素。如果k为0,直接返回栈顶元素。如果k为1,返回第二个元素,因为栈顶元素已被删除。对于更多操作次数,如果k大于数组长度,返回数组中的最大值,因为可以完全清空栈后随意添加。如果k等于数组长度,返回前k-1个元素的最大值,因为最后一次操作不能是添加操作(没有更多元素可以删除)。否则,比较前k-1个元素的最大值和第k个元素,返回两者中的最大值,因为最后一步操作可能是添加第k个元素。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
对于数组只有一个元素且k为奇数时返回-1的逻辑依据是什么?是否是因为无法在删除后再添加同一元素?
当数组只包含一个元素且k为奇数时,返回-1的逻辑依据是每次操作都需要先删除一个元素再添加一个元素。由于k为奇数,进行的操作次数是奇数次,因此最后一次操作是删除操作,导致栈为空。在这种情况下,栈顶元素不存在,因此无法再添加任何元素,最终结果为栈空,返回-1。
🦆
题解中提到如果k大于数组长度,则返回数组中的最大值。这种策略是否意味着我们可以完全清空栈然后选择任意元素添加?如何确保这种策略的有效性?
当k大于数组长度时,可以先使用若干操作完全清空栈(使用数组长度次删除操作),此时还剩余k - 数组长度次操作可以进行。由于栈已空,剩余的操作将仅包括添加操作。在这种情况下,我们可以选择数组中的任何一个元素添加到空栈中,因此返回数组中的最大值是确保最终栈顶元素尽可能大的最佳策略。这种策略的有效性在于它允许我们在任意选择元素进行添加,从而最大化栈顶元素的值。
🦆
在解决k等于数组长度时,最后一个操作不能是添加操作的原因是什么?是否因为此时栈已经为空,无法进行更多的删除操作?
当k等于数组长度时,根据题解策略,可以先执行k次删除操作来清空栈。此时,由于栈已经为空且没有其他元素可以删除,无法进行更多的删除操作。由于栈中已无元素,最后一个操作不能是再次添加操作,因为该操作应来自栈中已删除的元素。因此,最后一个操作只能是删除操作,导致栈为空。
🦆
题解中提到当k为1时,返回第二个元素作为解。这种情况下是否考虑了数组长度可能小于2的情况?如果数组只有一个元素,此时该如何处理?
题解确实提到当k为1时,应返回第二个元素作为解。然而,这种情况没有考虑到数组长度可能小于2的特殊情况。如果数组只有一个元素,根据题解中之前的逻辑,进行一次操作意味着删除这个唯一的元素,导致栈为空。因此,在数组只有一个元素的情况下,如果k为1,应返回-1,表示栈顶元素不存在。

相关问题