二分-LeetCode34. 在排序數組中查找元素的第一個和最後一個位置

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))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章