「算法模版」二分法

丁先生 2024-09-13 08:00 8次浏览 0 条评论 taohigo.com

面試或者考研上機考試中二分是基礎以及常考的題目,考察的面試者對二分的理解以及對邊界的理解能力。

本文主要講解的是二分的本質是什麼?如何理解二分?提供一個模版如何高效的寫出二分的代碼?


二分的本質是什麼

可能很多人想到二分就會想到binary search,但是數學上有另外一個名詞叫dichotomy(二分)。在維基百科上是怎麼定義二分法的?

許多人認為,一個問題是否能夠二分,本質是因為問題具有單調性(我們為什麼會有這種想法是因為,上課時候老師講二分的時候通常都會講解一個問題從一個有序數組中找到某個特定的target的值,讓我們認為單調性是二分的本質)。其實單調性不是二分的本質,也就是說問題不具有單調性的也是可以進行二分的(之後會舉出例子)。 二分的本質枚舉的答案空間是否可以分解成性質不同的兩個部分。 這兩個部分必須滿足兩個性質,如維基百科所說:「互補」「互斥」。即所有事物必須屬於雙方中的一方,且沒有事物可以同時屬於雙方。

上面一段不懂沒有關系,現在用一道例題leetcode34題來講解一下二分。

題意是在logn的時間內在非遞減數組中返回一個給定target值的起始位置和終點位置。

對於這個問題,我們暴力的做法可以是使用O(n)的時間復雜度來線性掃描這個數組,找到第一個target和最後一個target。

輸入: nums = [1,5,7,7,8,8,8,9,10], target = 8
輸出: [4,6]