Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、问题描述
给你一个下标从 0 开始的整数数组 nums
,它表示一个 栈 ,其中 nums[0]
是栈顶的元素。
每一次操作中,你可以执行以下操作 之一 :
- 如果栈非空,那么 删除 栈顶端的元素。
- 如果存在 1 个或者多个被删除的元素,你可以从它们中选择任何一个,添加 回栈顶,这个元素成为新的栈顶元素。
同时给你一个整数 k
,它表示你总共需要执行操作的次数。
请你返回 恰好 执行 k
次操作以后,栈顶元素的 最大值 。如果执行完 k
次操作以后,栈一定为空,请你返回 -1
。
题目链接:K 次操作后最大顶端元素。
二、题目要求
样例
输入: 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 是能得到的最大栈顶元素。
复制代码
考察
1.贪心模拟
2.建议用时15~35min
复制代码
三、问题分析
这一题要试着去理解,最大的顶端元素你事先是不知道在哪的,并且也不确定K次操作能否达到。
正如《阿甘正传》所说:“人生就像一盒巧克力,你永远不知道下一块是什么味道。”
这题我们要试着在允许的操作步数内,寻找到最大的元素。为了增加成功的概率,删除栈顶元素个数要尽可能多,逐步向后遍历。而在遍历的过程中也不能忽略,定义m保存删除元素中最大的,留着后续比较。
K次操作,那我们K-1次进行删除,遍历尽可能多的元素。
最后一次操作时,有两种选择:一种是选取之前删除的最大元素,另一种是在删除一个元素取栈顶元素。
两种比较一下,谁最大就行。
特殊情况:
1.当元素个数只有一个时,如果操作数为奇数,那么无法输出元素,只能输出-1。
2.假如操作数大于元素个数,那么只需要完全遍历数组寻找最大值就行
复制代码
四、编码实现
class Solution {
public:
int maximumTop(vector<int>& nums, int k) {
int i,n=nums.size(),m=0;//初始化操作
if(n==1&&k%2==1)//特殊情况,返回-1
return -1;
for(i=0;i<k-1&&i<n;i++)//k-1次删除操作
{
m=max(m,nums[i]);
}
if(k<n)//最后一次选择操作
m=max(m,nums[k]);//输出结果
return m;
}
};
复制代码