前言
這題標準運用了二分搜尋法,演算法通常需要使用二分思想,即每次能夠排除一半的範圍,快速的找出陣列中所要求的元素位置,這樣時間複雜度可達 O(log n)
,另外也可以使用一層迴圈找出元素位置,但時間複雜度會下修到O(n)
,這裡有 JAVA 和 Python 的寫法。
題目
Given a sorted array of distinct integers and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.
You must write an algorithm withO(log n)
runtime complexity.
給定一個已排序過有不同整數和目標值的陣列,如果有這個目標值就回傳這個索引 ,如果沒有這個值,就回傳按順序插入後的索引。
你必須寫出一個算法,為O(log n)
的時間複雜度。
題目連結:https://leetcode.com/problems/search-insert-position/
題目限制
1 <= nums.length <= 104
104 <= nums[i] <= 104
nums
contains distinct values sorted in ascending order.104 <= target <= 104
範例
1 | Input: nums = [1,3,5,6], target = 5 |
1 | Input: nums = [1,3,5,6], target = 2 |
1 | Input: nums = [1,3,5,6], target = 7 |
思路&筆記
主要是運用二分搜尋法來快速的找到值的位置,原理是每次循環都會將搜索範圍縮小一半。
如果 target 比中間值大,那麼搜索範圍將在中間值的右側。
如果 target 比中間值小,那麼搜索範圍將在中間值的左側。
- middle = start + ( end - start ) / 2 可取得中間值
- 找出目標值在中間值的左側還是右側
- 搜索範圍越來越小,直到最後回傳起點位置就是答案
[注意點] 之所以要用上述中間值的寫法會比較安全,因如果 start 和 end 趨近於最大數時,兩者相加起來的合可能會造成整數溢位
[備註] 回傳 start 原因是,在二分搜尋法中,每次都會將搜索範圍縮小一半。而搜尋範圍最小的時候,如果目標值不在該範圍內,那麼搜尋將停止。而此時,start 和 end 分別會指向搜尋範圍的左右兩端,此時 start 恰好會指向 target 應該插入的位置,因此最後返回 start 即可。
JAVA 實現
1 | class Solution { |
JAVA 其他實現
1 | class Solution { |
Python 實現
使用了和 Java 一樣的邏輯執行,換成 Python 的寫法。
1 | class Solution: |
成績
Language | Runtime | Memory |
---|---|---|
Java | 0ms | 41.9MB |
Python | 63ms | 17.2MB |