1、題目描述
https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/
給定一個按照升序排列的整數數組 nums,和一個目標值 target。找出給定目標值在數組中的開始位置和結束位置。
你的算法時間複雜度必須是 O(log n) 級別。(想到二分)
如果數組中不存在目標值,返回 [-1, -1]。
輸入: nums = [5,7,7,8,8,10], target = 8
輸出: [3,4]
2、代碼詳解
本題就是二分查找的常見變體
二分查找及其變體(Python)https://blog.csdn.net/IOT_victor/article/details/91357208
class Solution(object):
def searchRange(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
if len(nums) == 0:
return [-1, -1]
return [self.left_bound(nums, target), self.right_bound(nums, target)]
# 右界:最後第一個出現index
def right_bound(self, nums, target):
low, high = 0, len(nums) - 1
while low <= high:
mid = low + (high - low) // 2
if nums[mid] < target:
low = mid + 1
elif nums[mid] > target:
high = mid - 1
else:
if mid == len(nums) - 1 or nums[mid + 1] != target:
return mid
else: # 繼續在[mid+1, high]之間找
low = mid + 1
return -1
# 左界:第一個出現index
def left_bound(self, nums, target):
low, high = 0, len(nums) - 1
while low <= high:
mid = low + (high - low) // 2
if nums[mid] < target:
low = mid + 1
elif nums[mid] > target:
high = mid - 1
else: # nums[mid]=target
if mid == 0 or nums[mid - 1] != target: # 如果 mid 等於 0,那這個元素已經是數組的第一個元素,那它肯定是要找的;
# 如果 mid 不等於 0,但 a[mid] 的前一個元素 a[mid-1] 不等於 target,那也說明 a[mid] 就是我們要找的第一個值等於給定值的元素
return mid
else:
high = mid - 1 # 繼續找,要找的元素出現在 [low, mid-1] 之間
return -1
nums = [5,7,7,8,8,10]
target = 8
s = Solution()
print(s.searchRange(nums, target))