題目
思路:最直覺是直接 iterate nums,不過題目指定要 O(log n),所以用 binary search 才能達到
設定左右兩個指標作為可能答案範圍:[left, right],目標是移動這兩個指標,縮小答案範圍,直到我們找到答案或答案範圍縮到只剩 1 個為止
while left < right: binary search 什麼時候需要繼續下去?只要符合這個條件,就繼續 binary search迴圈寫完後,檢查一下:最後
left有可能會> right嗎?left要> right,唯一可能是left == right == mid的情況配合left = mid + 1,不過假如發生前者的情況就會跳出迴圈,所以不會有left > right的情況發生,也就是說如果跳出迴圈,當時的條件一定是left == right
看看 while 把 left & right 收斂到最後幾個的時候,還會不會繼續收斂直到跳出迴圈,或是其實不會繼續收斂而發生無窮迴圈,關注下面兩行移動
left&right的程式碼1
21. left = mid + 1
2. right = mid剩最後三個:此時 mid 會是中間那個,上面兩種操作都有助於收斂範圍
剩最後兩個:此時 mid == left,上面兩種操作一樣可以收斂範圍
剩最後一個:此時
left == right,跳出迴圈=> 確保了不會造成無窮迴圈
1 | def searchInsert(self, nums: List[int], target: int) -> int: |
參考文章:Come on, forget the binary search pattern/template! Try understand it!
- 這篇的思路是有幫助的,但他一開始設定的可能答案範圍錯了,導致還需要 post processing,假如真的是答案範圍,那範圍裡只剩一個的時候,那個就是答案,不會需要 post processing。
類似題:
- 704. Binary Search, First Bad Version
- TestDome: Sorted Search
- 這題其實可以想成在 search insert position, 找到的 position 即為他要的答案