給定一個升序排序的整數數組 nums
和一個目標值 target
,請找出目標值應插入的位置,保證插入後數組仍然是有序的。
必須設計一個演算法,其時間複雜度為 O(log n)。
範例 1
輸入: nums = [1,3,5,6], target = 5
輸出: 2
範例 2
輸入: nums = [1,3,5,6], target = 2
輸出: 1
範例 3
輸入: nums = [1,3,5,6], target = 7
輸出: 4
範例 4
輸入: nums = [1,3,5,6], target = 0
輸出: 0
由於數組是已經排序的,可以使用二分搜尋法來快速定位 target
應插入的位置:
left
和 right
,初始分別為數組的開頭與結尾。mid
:nums[mid] == target
,則直接返回 mid
。nums[mid] < target
,則目標值應該在右半部分,調整 left = mid + 1
。nums[mid] > target
,則目標值應該在左半部分,調整 right = mid - 1
。left > right
時,left
即為目標值應插入的位置。class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return left
直接從左到右遍歷數組,當找到第一個比 target
大的元素時,返回其索引。如果遍歷到最後都沒有找到,則目標值應插入數組末尾。此方法簡單,但不符合題目時間複雜度為 O(log n)的要求。
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
for i in range(len(nums)):
if nums[i] >= target:
return i
return len(nums)
Python 提供了 bisect
模組,可以直接用於查找目標值的插入位置。bisect_left
函數返回目標值的插入位置,並保證插入後數組仍然有序。
import bisect
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
return bisect.bisect_left(nums, target)
bisect_left
使用二分搜索實現。bisect
模組) 提供了一個簡潔的實現。建議在實際開發中,優先採用 解法一 或 解法三。