Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
leetcode 2202. K 次操作后最大化顶端元素
给你一个下标从 0 开始的整数数组 nums ,它表示一个 栈 ,其中 nums[0] 是栈顶的元素。
每一次操作中,你可以执行以下操作 之一 :
如果栈非空,那么 删除 栈顶端的元素。 如果存在 1 个或者多个被删除的元素,你可以从它们中选择任何一个,添加 回栈顶,这个元素成为新的栈顶元素。 同时给你一个整数 k ,它表示你总共需要执行操作的次数。
请你返回 恰好 执行 k 次操作以后,栈顶元素的 最大值 。如果执行完 k 次操作以后,栈一定为空,请你返回 -1 。
示例 1:
输入:nums = [5,2,2,4,0,6], k = 4
输出:5
解释:
4 次操作后,栈顶元素为 5 的方法之一为:\
- 第 1 次操作:删除栈顶元素 5 ,栈变为 [2,2,4,0,6] 。\
- 第 2 次操作:删除栈顶元素 2 ,栈变为 [2,4,0,6] 。\
- 第 3 次操作:删除栈顶元素 2 ,栈变为 [4,0,6] 。\
- 第 4 次操作:将 5 添加回栈顶,栈变为 [5,4,0,6] 。
注意,这不是最后栈顶元素为 5 的唯一方式。但可以证明,4 次操作以后 5 是能得到的最大栈顶元素。
示例 2:
输入:nums = [2], k = 1
输出:-1
解释:
第 1 次操作中,我们唯一的选择是将栈顶元素弹出栈。
由于 1 次操作后无法得到一个非空的栈,所以我们返回 -1 。
提示:
1 <= nums.length <= 105
0 <= nums[i], k <= 109
题目分析
根据题意我们需要找出K 次操作后最大化顶端元素,这边需要注意一下的是这里的最大化顶端元素不一定是栈nums中最大值。
我们操作会有俩种情况:
- 当栈nums中非空时,也还未删除过元素时,我们需要弹出栈顶
- 当栈nums中非空时,也还删除过元素时,我们可以弹出栈顶或入栈一个被删除的元素
我们从实例2中可以看出当栈nums长度为1时并且k为奇数,那么必然是-1,反之当栈nums长度为1时并且k为偶数时就时nums[0]。
其他情况我们需要比较一下栈nums长度与k那个小,并进行循环当i不等于k-1时通过Math.max找出最大值。这个最大值就是我们所需要的。
代码实现
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var maximumTop = function(nums, k) {
if(nums.length === 1 && k%2 === 1){
return -1
}else if(nums.length === 1 && k%2 === 0){
return nums[0]
}else{
let n = Math.min(nums.length-1,k)
let ans = -1
for(let i=0; i<=n; i++){
if(i !== k-1){
ans = Math.max(ans,nums[i])
}
}
return ans
}
};