Leetcode演算法——35、查詢可插入位置
阿新 • • 發佈:2018-11-07
給定一個升序陣列和一個目標值,返回目標值的索引。
如果不存在,返回目標值按照順序應該插入到的位置。
假設陣列中沒有重複元素。
示例:
Example 1:
Input: [1,3,5,6], 5
Output: 2
Example 2:
Input: [1,3,5,6], 2
Output: 1
Example 3:
Input: [1,3,5,6], 7
Output: 4
Example 4:
Input: [1,3,5,6], 0
Output: 0
思路
在一個有序陣列中查詢某個目標值的位置,可以使用經典的二分法。
但本題在當查詢不到此元素時,需要返回此元素應該插入到的位置,來保證新陣列仍然是一個有序陣列。
因此,需要在經典二分法的基礎上進行改進,如果元素存在,那麼邏輯與經典二分法相同;如果元素到最後沒有查詢到,那麼需要額外確認此元素需要插入的位置。
我們使用遞迴進行二分法,當元素最後沒有查詢到時,一定是當前陣列的長度只有2位時。如果陣列第一位不等於目標值,那麼肯定小於目標值(因為二分法的每次遞迴都會保證目標值的大小是位於當前陣列的最小值和最大值的範圍之內的),因此目標值需要插入的位置肯定是陣列的第二位。
python實現
def searchInsert(nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
二分法查詢。
結束條件需要改變一下:當查詢到最後兩位時,如果都不滿足,則返回應該插入到的位置。
"""
def binary_search(nums, l, u, target):
'''
二分法查詢。
呼叫此函式之前需要保證:
1、nums[l] <= target <= nums[u]
2、len(nums) >= 2
'''
if u - l == 1:
if nums[l] == target:
return l
else:
return u
mid = (l+u) // 2
if nums[mid] == target:
return mid
elif target > nums[mid]:
return binary_search(nums, mid, u, target)
else:
return binary_search(nums, l, mid, target)
if not nums:
return 0
if target <= nums[0]:
return 0
if target > nums[-1]:
return len(nums)
return binary_search(nums, 0, len(nums)-1, target)
if '__main__' == __name__:
nums, target = [1,3,5,6], 0
print(searchInsert(nums, target))