【Leetcode】二分法專題

1.兩個萬能模板

二分法萬能模板1

二分法萬能模板2

2.兩個錯誤示范,造成死循環(huán)

image.png
錯誤模板

3.避免判斷兩個指針

避免判斷兩個指針

4.左右中位數(shù)

左右中位數(shù)

5.二分邏輯技巧

二分邏輯技巧

6.總結(jié)核心技巧

核心技巧

35. 搜索插入位置

給定一個排序數(shù)組和一個目標值,在數(shù)組中找到目標值,并返回其索引。如果目標值不存在于數(shù)組中,返回它將會被按順序插入的位置。

class Solution(object):
    def searchInsert(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        n = len(nums)
        left = 0
        right = n - 1
        if target < nums[0]: return 0
        if target > nums[n - 1]: return n

        while left < right:
            # mid = left + (right - left) // 2
            mid = (left + right) >> 1
            if nums[mid] < target:
                left = mid + 1
            else:
                right = mid
        if nums[left] >= target:
            return left
        else:
            return left + 1

33. 搜索旋轉(zhuǎn)排序數(shù)組

假設(shè)按照升序排序的數(shù)組在預(yù)先未知的某個點上進行了旋轉(zhuǎn)。
( 例如,數(shù)組 [0,1,2,4,5,6,7] 可能變?yōu)?[4,5,6,7,0,1,2] )。
搜索一個給定的目標值,如果數(shù)組中存在這個目標值,則返回它的索引,否則返回 -1 。
你可以假設(shè)數(shù)組中不存在重復(fù)的元素。
你的算法時間復(fù)雜度必須是 O(log n) 級別。

class Solution:
    def search(self, nums, target):
        size = len(nums)
        if size == 0:
            return -1

        left = 0
        right = size - 1
        while left < right:
            # mid = left + (right - left + 1) // 2
            mid = (left + right + 1) >> 1
            if nums[mid] < nums[right]:
                # [7,8,9,1,2,3,4,5,6] ,后半部分有序
                if nums[mid] <= target <= nums[right]:
                    left = mid
                else:
                    right = mid - 1
            else:
                # 注意:寫這個 if 語句的時候,要讓分支和上面一樣
                # [4,5,6,7,8,9,0,1,2],前半部分有序
                if nums[left] <= target <= nums[mid - 1]:
                    right = mid - 1
                else:
                    left = mid
        # 后處理
        return left if nums[left] == target else -1

34. 在排序數(shù)組中查找元素的第一個和最后一個位置

給定一個按照升序排列的整數(shù)數(shù)組 nums,和一個目標值 target。找出給定目標值在數(shù)組中的開始位置和結(jié)束位置。你的算法時間復(fù)雜度必須是 O(log n) 級別。

class Solution(object):
    def searchRange(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """

        def find_left(nums, left, right, target):
            while left < right:
                mid = (left + right) >> 1
                if nums[mid] < target:
                    left = mid + 1
                else:
                    right = mid
            if left == n: return -1
            return left if nums[left] == target else -1

        def find_right(nums, left, right, target):
            while left < right:
                mid = (left + right + 1) >> 1
                if nums[mid] > target:
                    right = mid - 1
                else:
                    left = mid
            return left if nums[left] == target else -1

        if not nums:
            return [-1, -1]

        n = len(nums)
        left = find_left(nums, 0, n - 1, target)
        if left == -1:
            return [-1, -1]
        right = find_right(nums, 0, n - 1, target)
        return [left, right]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容