LeetCode破解之顶端元素

132 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

题目描述

给你一个下标从 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 是能得到的最大栈顶元素。

贪心

这个题目我的初步思路是:果真是一贪得所有啊,贪心有简单且容易理解,这题就是一个典型的分类情况处理贪心题目,我们只需要针对不同的情况做出处理就可以了,不同情况的处理如下:

  • 当k==0时,直接返回 nums[0]

  • 当n==1时,分两种种情况

    • 当k为偶数时,也直接返回 nums[0]

    • 当k为奇数时,直接返回 -1

  • 当k<=n时,因为最大的数应当出现的 0到k-2、和k之间。第k-1个数无法成为最大值。因为正好是最后一次操作,要么把这个数拿掉,要么在这个数前面放一个别的数。

  • 当k>n时, 返回所有数字中的最大值

特殊情况:因为最终要比较其实是最后一次操作的抉择,如果此时nums[k-2]已出栈且栈顶为nums[k-1],我们其实有两种选择,最后取其中的最大值即可:

  • 继续弹出nums[k-1],那么最终栈顶为nums[k]
  • 放当前最大的元素进栈顶,那么此时栈顶为maxArr[k-2]
class Solution {
    public int maximumTop(int[] nums, int k) {
        int n = nums.length;
        int rst =-2;
        
        if(k==0) return nums[0];
        if(n==1){
            if(k%2==0) return nums[0];
            return -1;
        }
        if(k<=n){
            for(int i=0;i<k-1;i++)
                rst = rst>nums[i]?rst:nums[i];
            if(k<n) rst = rst>nums[k]?rst:nums[k];
        }else{
            for(int i=0;i<n;i++)
                rst = rst>nums[i]?rst:nums[i];
        }
        return rst;
    }
}

最后

一贪得所有呀,至理名言啊~~~