

如果序列中数据都不重复,那么这个题目难度会小很多。本文介绍三种解法。
(1)暴力枚举法
暴力枚举子序列左右端点i和j,检查a[i+1]到a[j-1]间是否有比端点更小的值,复杂度O(N^3)。可得20分。
(2)RMQ优化
RMQ(Range Minimum/Maximum Query)可以看成是一种查找结构,能快速找到区间内极值,每次查找的复杂度是O(1)级别。这样可以把上述算法“检查a[i+1]到a[j-1]间是否有比端点更小的值”优化,整个算法复杂度O(N^2),可得70分。
介绍一种骗分技巧,出题人在出大数据的时候,例如上面100000级别数据,经常会出所有数据全部相同的数据点,或者是1,2,3,4.....100000这样的数据点。如果最后实在没有好方法,且时间充足,可编写代码针对这些特殊情况做处理。此方法不保证有效性!!!
(3)单调栈
经验之谈:如果枚举a[i]为序列次小值,找到数据a[i]左右两端第一个比他小得的问题,这是典型的单调栈问题。读者必须掌握单调栈基础用法才可以阅读下面解题思路。
此题目可以考虑枚举第i个元素,a[i]向左找到第一个比a[i]小的值a[k],此时[k,i]区间一定满足条件,
那么是否能继续向左找更小呢?模拟后发现不可以,例如序列1 3 6 5 ,5向左找到3就可以停下来了,以5为次小的序列是(3,6, 5),(1,3,6,5)是不行的。当然也有可能i元素左侧没有比它小的,这样就找不到满足条件子序列。

最低0.47元/天 解锁文章
1551

被折叠的 条评论
为什么被折叠?



