[leetcode 3605][Go][二分答案]能二分的不只有数组

[leetcode 3605][Go][二分答案]能二分的不只有数组
inkOrCloud题目链接
解题思路
这道题说难不难,只是追求通过所有实例的话只要根据题目中最小化最大值想到二分答案就能做到
单次计算
这里声明一个子函数func sub(nums []int, maxC int, length int) bool用于计算maxC次操作内能否使最长稳定子数组的长度小于等于length
1 | func gcd(a int, b int) int { |
这里触发内循环(重新计算l坐标)的条件是(l,
r]最大公因数为1(即至少存在两个互质的元素)而单次内循环的时间复杂度达到
答案二分
接下来只要用二分法确定sub返回true的最小长度就行了 1
2
3
4
5
6
7
8func minStable(nums []int, maxC int) int {
//最小可能的稳定子数组长度为0,最大可能长度为len(nums)
//所以直接定义边界[0,len(nums)+1)并执行二分查找就行
var ret = sort.Search(len(nums)+1, func(i int) bool {
return sub(nums, maxC, i)
})
return ret
}

![[leetcode 3321][Go][有序集合]计算子数组的 x-sum II](https://s3.inkorcloud.top/image/2025/11/c9f55b2ecb04d16a57547b9f4de294ef.png)
![[leetcode 2589][Go][贪心]完成所有任务的最少时间](https://s3.inkorcloud.top/image/2025/11/b966fd1a91aa1ea098b86e6d778523c2.png)
![[leetcode 3234][Go]统计1显著的字符串的数量](https://s3.inkorcloud.top/image/2025/11/a72a47911de291f51cbb5902e4811c1f.png)
![[leetcode 1611][Go][位运算][记忆化搜索]使整数变为 0 的最少操作次数](https://s3.inkorcloud.top/image/2025/11/9715b5f3d8a7574ded3648767538558e.png)
![[leetcode 2528][Go][二分答案][差分数组][前缀和]最大化城市的最小电量](https://s3.inkorcloud.top/image/2025/11/fa0013722d9361b4383839722394dcf2.png)