題目描述
解題思路
解法一:二分查找法
第一步:通過正常的二分查找法定位到要查找到的元素
第二步:定位到指定的元素後,再找到它的開始和結束位置
舉例說明:
當nums[mid] == target時,開始查找第一個和最後一個位置:
- 查找第一個位置,爲了縮小右邊界,開始從左邊查找,如果nums[mid] = nums[mid-1],則target出現的第一個位置還需繼續向左查找,繼續使用二分法得到mid=1,小於target,則L加1,繼續使用二分法得到mid=2,且nums[mid] != nums[mid-1],則2爲target出現的起始位置
- 查找最後一個位置,同上開始從右邊查找,如果nums[mid] = nums[mid+1],則target出現的最後一個位置還需繼續向右查找,繼續使用二分法得到mid=5,此時nums[mid] != nums[mid+1],則說明5爲target出現的終止位置。
python代碼
class Solution:
def searchRange(self, nums, target):
if not nums:
return [-1,-1]
n = len(nums)
# 查找第一個和最後一個元素
def find(is_find_first):
begin = 0
end = n-1
# if和elif的邏輯跟正常的二分查找一樣
while begin<=end:
mid = begin+(end-begin)//2
if nums[mid]>target:
end = mid-1
elif nums[mid]<target:
begin = mid+1
# 找到目標值了,開始定位到第一個和最後一個位置
else:
# 查找第一個和最後一個邏輯很類似,這裏用一個變量標記
# 是查找第一個還是查找最後一個
if is_find_first:
# 如果不滿足條件,縮小右邊界,繼續往左邊查找
if mid>0 and nums[mid]==nums[mid-1]:
end = mid-1
else:
return mid
else:
# 如果不滿足條件,增大左邊界,繼續往右邊查找
if mid<n-1 and nums[mid]==nums[mid+1]:
begin = mid+1
else:
return mid
return -1
return [find(True), find(False)]
s = Solution()
print(s.searchRange([5,7,8,8,8,8,10],8))