目录
前言
一般来说,遇到「最值问题」通用的方法都是动态规划,而有一类「最值问题」可以用其他方法更加巧妙、简单方便的解决,这类问题的常见问法是「使……最大值尽可能小」。
这类问题也是大厂笔试面试常见题型,2020 年美团笔试题、字节面试题中都出现过。
这类问题有三大特征:
- 求最值(一般是最小值)
- 值的搜索空间是线性的
- 对该值有一个限制条件,并且若
x
满足条件,则[x, +∞)
都满足条件,反之(-∞, x]
都不满足条件。
为了方便大家理解这类问题到底是个什么玩意儿,本汪在这里列出 leetcode 上的一道题目作为例子:
给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。
不熟悉二分法的同学初遇此题,看到关键词“分割成 m 份”、“最小”,就想到了动态规划。诚然此题具备了使用动态规划的一切前提条件,也确实可以通过动态规划做出来,但其时间复杂度为 O ( n 2 × m ) O(n^2×m) O(n2×m) , 空间复杂度为 O ( n ∗ m ) O(n*m) O(n∗m).
如果你看了本汪的这篇文章,学会了用二分法解决这一类问题,那么时间复杂度可以优化到 O ( n ∗ l o g x ) O(n * logx) O(n∗lo