在过去几年里,我花费了大量时间准备软件工程面试。像许多开发者一样,我在数据结构与算法的学习之旅初期专注于死记硬背。我想要掌握每一种模式、每一个技巧以及力扣(LeetCode)上的每一道解法。如果一道题目看起来像双指针问题,我就使用双指针法。如果它看起来像动态规划问题,我就尝试动态规划。
当时我没有意识到的是,擅长解决问题的人不仅仅是模式匹配者。他们是侦探。他们在写下第一行代码之前就会寻找线索。
我的思维方式发生的最大转变之一,始于我开始更加密切地关注约束条件。
约束条件是隐藏的提示
在面试准备过程中,我取得的最大突破之一,是开始将约束条件视为线索而非限制。最近,我正在钻研一道名为比当前数字小的数字有多少个的力扣(LeetCode)题目。
这道题目本身并不是特别难:
对于每个数字,返回数组中比它小的数字的数量。乍一看,人们很容易开始考虑排序、哈希表或暴力比较。但在思考算法之前,我先查看了约束条件:
第一个约束条件立即告诉我,时间复杂度为 O(n²) 的解法可能是可以接受的。
毕竟:
对于现代计算机来说,这并不算大量的运算操作。但引起我注意的是第二个约束条件:



