普通的LIS问题的时间复杂度是O(n2),瓶颈主要是在方程f[i]=1+max(f[j]),其中<<1≤j<i且a[j]<a[i]中寻找j上
我们尝试用贪心优化,这里的j就是小于i的比a[i]小的且f[j]最大的j
根据贪心原则,假设当前循环到了i(还没有开始处理),我们用h[k]表示f[j]为k且a[j]最小的a[j](<<1≤j<i)
假设当前循环到了i,此前的最优长度为len
那么如果a[i]>h[len],那么就可以len++,h[len]=a[i]
否则的话,我们可以发现h是单调的(为什么见下),于是我们二分,找到一个位置l,满足l是最大的且h[l]<a[i],然后就有f[i]=l+1,再考虑修改,肯定就是h[l+1]=min(h[l+1],a[i]),此时修改后h仍然是单调的,所以h一直都是单调的
当然上述方法有一定思维含量,我们可以利用数据结构来减少思维含量
我们将a离散化,设h[k]表示值为k(离散化后)的最大的f,我们查找区间[1,a[i]−1]的最大值就好了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构