在已排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置
給定一個(gè)按照升序排列的整數(shù)數(shù)組`nums`,和一個(gè)目標(biāo)值`target`。要求找出給定目標(biāo)值在數(shù)組中的開(kāi)始位置和結(jié)束位置。時(shí)間復(fù)雜度為O(logn)。解決方案我們可以使用二分查找來(lái)解決這個(gè)問(wèn)題。首先,
給定一個(gè)按照升序排列的整數(shù)數(shù)組`nums`,和一個(gè)目標(biāo)值`target`。要求找出給定目標(biāo)值在數(shù)組中的開(kāi)始位置和結(jié)束位置。時(shí)間復(fù)雜度為O(logn)。
解決方案
我們可以使用二分查找來(lái)解決這個(gè)問(wèn)題。首先,我們需要編寫(xiě)一個(gè)函數(shù),通過(guò)二分查找獲取一個(gè)指定值在有序數(shù)組中第一次出現(xiàn)的位置。如果沒(méi)有找到該元素,則返回-1。其偽代碼如下:
```
function findFirstOccurrence(nums, target):
left 0
right nums.length - 1
while left < right:
mid (left right) / 2
if nums[mid] target and (mid 0 or nums[mid-1] ! target):
return mid
elif nums[mid] < target:
left mid 1
else:
right mid - 1
return -1
```
接下來(lái),我們?cè)倬帉?xiě)一個(gè)函數(shù),通過(guò)二分查找獲取一個(gè)指定值在有序數(shù)組中最后出現(xiàn)的位置。如果沒(méi)有找到該元素,則返回-1。其偽代碼如下:
```
function findLastOccurrence(nums, target):
left 0
right nums.length - 1
while left < right:
mid (left right) / 2
if nums[mid] target and (mid nums.length-1 or nums[mid 1] ! target):
return mid
elif nums[mid] > target:
right mid - 1
else:
left mid 1
return -1
```
接下來(lái),我們將上述兩個(gè)二分查找方法結(jié)合起來(lái),編寫(xiě)一個(gè)函數(shù)來(lái)獲取一個(gè)元素在排序數(shù)組中第一次和最后一次出現(xiàn)的位置。其偽代碼如下:
```
function searchRange(nums, target):
first findFirstOccurrence(nums, target)
last findLastOccurrence(nums, target)
return [first, last]
```
測(cè)試方法
為了驗(yàn)證我們的解決方案是否正確,我們需要編寫(xiě)一些測(cè)試方法。以下是一個(gè)簡(jiǎn)單的測(cè)試方法:
```
function test():
nums [1, 2, 2, 3, 4, 5, 5, 5, 6]
target 5
result searchRange(nums, target)
if result [5, 7]:
print("Test Passed")
else:
print("Test Failed")
test()
```
運(yùn)行測(cè)試方法
運(yùn)行上述測(cè)試方法,并觀察控制臺(tái)輸出。如果輸出符合預(yù)期,則本地測(cè)試通過(guò)。
提交算法
在完成本地測(cè)試之后,可以將算法提交到相應(yīng)的平臺(tái)進(jìn)行測(cè)試。如果經(jīng)過(guò)平臺(tái)測(cè)試也通過(guò)了,那么我們的解決方案就是正確的。
通過(guò)以上步驟,我們可以在已排序數(shù)組中高效地查找元素的第一個(gè)和最后一個(gè)位置。這種方法的時(shí)間復(fù)雜度為O(logn),相比于線(xiàn)性查找的O(n)要更加高效。