【Leetcode 34】在排序數組中查找元素的第一個和最後一個位置

題目描述

在這裏插入圖片描述

解題思路

解法一:二分查找法

第一步:通過正常的二分查找法定位到要查找到的元素
第二步:定位到指定的元素後,再找到它的開始和結束位置
舉例說明
在這裏插入圖片描述
當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))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章