5227 K 次操作后最大化顶端元素(贪心)

1. 问题描述:

给你一个下标从 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 <= 10 ^ 5
0 <= nums[i],k <= 10 ^ 9
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximize-the-topmost-element-after-k-moves/

2. 思路分析:

首先我们需要分析一下取到的最大值有什么特点(一般遇到这种类型的题目看一下有什么特点,举例子模拟一下其中的过程看能否发现一些规律),我们可以分情况讨论一下,当k <= n时,其中n是nums数组的长度,可以发现最多删除k次,数组的下标是从0开始的,第一种最大值在下标为k的位置取到,也即删除掉前面的k个元素;第二种情况是在k - 1的位置取到,此时需要满足k是奇数才可以取到这个最大值;第三种情况是除了上面说到的第一,二种情况取到的最大值,也即前k - 1个数中取到最大值;当k > n的时候我们一定可以通过若干次操作(其中包括一些无效的操作)使得最大值等于数组中所有元素的最大值(这道题目的边界情况比较恶心)。

3. 代码如下:

from typing import List


class Solution:
    def maximumTop(self, nums: List[int], k: int) -> int:
        n = len(nums)
        if k == 0:
            return nums[0]
        elif k % 2 == 1 and n == 1:
            return -1
        elif k == 1:
            return nums[1]
        t = 0
        if k <= n:
            # 当k < n的时候说明删除掉前k个数之后下一个数字取到最大值
            if k < n:
                t = max(t, nums[k])
                # 第k - 1个位置取到最大值
                if k % 2 == 1:
                    t = max(t, nums[k - 1])
            # 小于n的时候一定是前k - 1个元素取到最大值
            t = max(t, max(nums[:k - 1]))
        else:
            t = max(nums)
        return t
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值