小红书5月7日算法笔试编程题

第二问是个脑筋急转弯,不是典型的算法题。时间复杂度和空间复杂度都是 O(n)。

现有 n 个整数 a1, ..., an,每次操作可以删除一段下标连续的数字(例如 a2, a3, a4),但删除后剩余的整数个数必须大于 0。请进行最多 k 次这样的操作,使得最后剩余的整数中的最小值最大,并将这个最大的最小值输出。(1≤n,k≤10^5)

输入数据有两行,为

n k

a1 ... an

以下为一个样例

输入:

5 1

58 63 61 89 57

输出:

58

对问题的空间进行合理划分是本题的关键:

  1. 当 k > 1 时,只要找到最大值所在位置,并将两侧的片段删除即可,这样剩下的就是全局最大值。
  2. 当 k = 1 时,如果删除中间的一段子列,那么剩下的片段为 [头1, ..., 尾1] 和 [头2, ..., 尾2],有如下关系

min⁡([头1,...,尾1])≤头1

min⁡([头2,...,尾2])≤尾2

min⁡(剩下的片段)≤max⁡(头1,尾2)

而目标函数的上界(不等式的右侧) max⁡(头1,尾2) 可以通过一次切割(保留最左的头1,或保留最右的尾2)实现,因此切中间的子片段一定不优于仅保留 a1​,an​ 中的最大值,同样可以发现保留左侧或保留右侧也一定不优于仅保留 a1, an​ 中的最大值。 代码如下

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

#小红书##小红书笔试##小红书24届实习招聘##24届实习#
全部评论
k=1的角度就是左右两端至少会留一端,而部分最小值≥整体最小值,所以取两个端点的最大值即可
3 回复 分享
发布于 2023-05-07 18:31 北京
啊这为啥我看到的题目不是写的下标连续,这题目描述写的乱七八糟的,我以为是数值连续的区间。。。。
点赞 回复 分享
发布于 2023-05-07 19:55 上海

相关推荐

9 6 评论
分享
牛客网
牛客企业服务