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大于数组长度,则返回数组中的最大值。这种策略是否意味着我们可以完全清空栈然后选择任意元素添加?如何确保这种策略的有效性?
▷🦆
在解决k等于数组长度时,最后一个操作不能是添加操作的原因是什么?是否因为此时栈已经为空,无法进行更多的删除操作?
▷🦆
题解中提到当k为1时,返回第二个元素作为解。这种情况下是否考虑了数组长度可能小于2的情况?如果数组只有一个元素,此时该如何处理?
▷