【问题标题】:maximize the top element of the stack after performing exactly K operations在执行完 K 次操作后最大化堆栈的顶部元素
【发布时间】:2019-01-12 12:11:47
【问题描述】:

给定一个包含 N 个整数的堆栈。您需要在执行完 K 个操作后最大化堆栈的顶部元素。在一个操作中,您可以从堆栈中弹出一个元素或将任何弹出的元素压入堆栈。如果在执行 K 次操作后堆栈为空,并且没有其他方法使堆栈为非空,则打印 -1。

输入格式:

输入的第一行由两个空格分隔的整数 N 和 K 组成。 第二行输入由 N 个空格分隔的整数组成,表示堆栈的元素。第一个元素代表栈顶,最后一个元素代表栈底。

输出格式:

在恰好执行 K 次操作后打印堆栈的最大可能顶部元素。

示例输入

6 4

1 2 4 3 3 5

样本输出

4

【问题讨论】:

    标签: arrays algorithm data-structures stack


    【解决方案1】:

    在 k-1 个操作中弹出 k-1 个元素。现在对于最后一个操作,您可以再弹出一个元素,也可以从弹出的元素中推送一个元素。

    所以比较这两种情况,如果你在第k个操作中弹出元素,顶部的元素应该比所有前k-1个弹出元素都多,否则对于第k个操作,从k-1个弹出元素中推送最大的元素。

    【讨论】:

    • 你能想到任何输出为-1的测试用例吗?那么K>N呢。对于K>N,输出将是最大元素对吗?
    • k = 1,n = 1,解为 -1。只有大小写,否则你也可以避免弹出第二个数字。
    • 对于k > n,答案是最大的数。
    【解决方案2】:

    我没有足够的声誉,所以添加它的答案。
    1. 对于 k>n,答案不是强制性的,如给定示例所示:

    3 5
    1 2 3
    K = 5,在第一次操作中我们弹出 1,然后弹出 2,
    现在我们有 K = 3,栈顶元素是 3
    弹出 3,K = 2,
    push 3,K = 1,栈顶元素 = 3
    因此,如果我们在这里弹出 3,则 K = 0 并且堆栈为空,根据问题陈述将是 -1 作为答案,这将是错误的。
    所以回到 K = 3 和 st.top() = 3 并且弹出元素为 1,2 的场景
    推 2,K = 2
    弹出 2,K = 1
    推 2,K = 0
    答案即最大元素在 5 操作后为 2。

    2.对于 n = 1,如果 K 的值为奇数,则答案将为 -1 否则它将是第一个元素

    【讨论】:

    • 问题是“将任何弹出的元素推入堆栈”,因此您不一定需要推送最近弹出的元素。因此,在您的情况下,弹出 3 后,先按 2,然后按 3。
    • 是的..我读错了..但我认为第 2 点是正确的,任何关于它的评论。
    【解决方案3】:

    python3 代码:

    n,k = [int(x) for x in input().split()]
    arr = [int(x) for x in input().split()]
    if n == 1:
        if k%2 == 1:
            print(-1)
        else:
            print(arr[0])
    elif k >= n:
        print(max(arr))
    else:
        print(max(arr[k-2],arr[k]))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-14
      • 2022-11-02
      • 2015-10-06
      • 2016-09-05
      • 2019-04-11
      • 1970-01-01
      • 2013-09-25
      • 2012-02-06
      相关资源
      最近更新 更多