如何使用二进制搜索解决以下问题?
How to solve following problem using binary search?
我们得到了一个整数数组,我们需要找到 size 的最小子段,这样在删除它之后数组中的所有元素都是不同的。如何使用二进制解决这个问题在 O(nlogn) 中搜索?我尝试阅读各种使用二进制搜索的提交,但我无法理解它们。
我的尝试 - 我使用蛮力在 n^2logn 中解决了这个问题,但我想知道如何应用二进制搜索来解决 O(nlogn) 中的这个问题。
Link 问题 - https://codeforces.com/contest/1208/problem/B
Link 实现二进制搜索的解决方案之一 -https://codeforces.com/contest/1208/submission/59494540
在链接的解决方案中,如果可以通过删除大小为 siz
的子数组使所有数字唯一,则函数 check(int siz)
returns 为真。它在 O(n) 时间内完成。
由于 check(x) == true
意味着 check(y) == true
对于所有 y >= x
,main()
函数可以进行二进制搜索以找到 siz
的最小值哪个check(siz) == true
,哪个是问题的解
如果check(mid) == true
,则答案不大于mid
。如果 check(mid) == false
,则答案大于 mid
。
二进制搜索需要 O(log n) 次 check
的评估,总共 O(n log n) 时间。
我们得到了一个整数数组,我们需要找到 size 的最小子段,这样在删除它之后数组中的所有元素都是不同的。如何使用二进制解决这个问题在 O(nlogn) 中搜索?我尝试阅读各种使用二进制搜索的提交,但我无法理解它们。
我的尝试 - 我使用蛮力在 n^2logn 中解决了这个问题,但我想知道如何应用二进制搜索来解决 O(nlogn) 中的这个问题。
Link 问题 - https://codeforces.com/contest/1208/problem/B
Link 实现二进制搜索的解决方案之一 -https://codeforces.com/contest/1208/submission/59494540
在链接的解决方案中,如果可以通过删除大小为 siz
的子数组使所有数字唯一,则函数 check(int siz)
returns 为真。它在 O(n) 时间内完成。
由于 check(x) == true
意味着 check(y) == true
对于所有 y >= x
,main()
函数可以进行二进制搜索以找到 siz
的最小值哪个check(siz) == true
,哪个是问题的解
如果check(mid) == true
,则答案不大于mid
。如果 check(mid) == false
,则答案大于 mid
。
二进制搜索需要 O(log n) 次 check
的评估,总共 O(n log n) 时间。