我们给定了一个整数数组,我们需要找到最小子段的 size ,以便将其删除后数组中的所有元素都是不同的。如何使用O(nlogn)中的二进制搜索解决此问题)?我试图阅读使用二进制搜索的各种提交内容,但我听不懂它们。
我的尝试-我使用蛮力在n ^ 2logn中解决了此问题,但我想知道如何应用二进制搜索在O(nlogn)中解决此问题。
问题链接-https://codeforces.com/contest/1208/problem/B
实现二进制搜索的解决方案之一的链接-https://codeforces.com/contest/1208/submission/59494540
答案 0 :(得分:0)
在链接的解决方案中,如果可以通过删除大小为check(int siz)
的子数组来使所有数字唯一,则函数siz
返回true。它是在 O(n)时间内完成的。
由于check(x) == true
表示所有check(y) == true
的{{1}},因此y >= x
函数可以进行二进制搜索以找到main()
的最小值,其中{ {1}},这就是解决问题的方法。
如果siz
,则答案不大于check(siz) == true
。如果为check(mid) == true
,则答案大于mid
。
二进制搜索需要check(mid) == false
的 O(log n)个评估,总共需要 O(n log n)个时间。