1.問題描述:
給定乙個排序陣列和乙個目標值,如果在陣列中找到目標值則返回索引。如果沒有,返回到它將會被按順序插入的位置。
你可以假設在陣列中無重複元素。
2.樣例:
[1,3,5,6],5 → 2
[1,3,5,6],2 → 1
[1,3,5,6], 7 → 4
[1,3,5,6],0 → 0
3.**:
我實現的方法,有點複雜
class solution:
"""@param a: an integer sorted array
@param target: an integer to be inserted
@return: an integer
"""def searchinsert(self, a, target):
# write your code here
if a == or target <= a[0]:
return 0
for i in range(1, len(a)):
if a[i] == target or a[i - 1] < target and target < a[i]:
return i
elif target > a[i] and i + 1 == len(a):
return i + 1
另外看到乙個更加簡便的方法,使用enumerate來迭代a
def searchinsert2(self, a, target):
# write your code here
if len(a) == 0:
return 0
for i, num in enumerate(a):
if target <= num:
return i
return len(a)
本題的挑戰難度是實現o(log(n)) 時間複雜度。非常明顯是需要用二分法來實現,並且題目已知是乙個有序的陣列,所以可以使用二分搜尋。
def searchinsert3(self, a, target):
left, right = 0, len(a) - 1 # 初始化左右端點位置
while left <= right: # 當條件合法時
mid = left + (right - left) // 2 # 獲取中點,如果是偶數取靠左的位置
if a[mid] == target: # 找到該數
return mid # 直接返回
elif a[mid] > target: # 如果當前位置數比插入值大
right = mid - 1 # 更新右端點
else: # 如果當前位置數比插入值小
left = mid + 1 # 更新左端點
return left # 返回插入位置,這裡是左端位置
LintCode 搜尋區間
題目 給定乙個包含 n 個整數的排序陣列,找出給定目標值 target 的起始和結束位置。如果目標值不在陣列中,則返回 1,1 樣例 給出 5,7,7,8,8,10 和目標值target 8,返回 3,4 思路 用二分法分別查詢出目標值的左右邊界。查詢左邊界時a r 永遠大於等於target,a p...
單詞搜尋 LintCode
給出乙個二維的字母板和乙個單詞,尋找字母板網格中是否存在這個單詞。單詞可以由按順序的相鄰單元的字母組成,其中相鄰單元指的是水平或者垂直方向相鄰。每個單元中的字母最多只能使用一次。樣例 給出board abce sfcs adee word abcced 返回 true,word see 返回 tru...
搜尋區間 LintCode
描述 給定乙個包含 n 個整數的排序陣列,找出給定目標值 target 的起始和結束位置。如果目標值不在陣列中,則返回 1,1 樣例 給出 5,7,7,8,8,10 和目標值target 8,返回 3,4 挑戰 時間複雜度 o log n 思路 ifndef c61 h define c61 h i...