编程语言
首页 > 编程语言> > 【LeetCode练习|算法通关手册:Python版】03. 数组篇_二分查找【未完待续】

【LeetCode练习|算法通关手册:Python版】03. 数组篇_二分查找【未完待续】

作者:互联网

2021.11.23-2021.11.25
Datawhale 11月学习内容;学习地址:https://algo.itcharge.cn/

文章目录

1. 二分查找

基本算法思想:是一种在有序数组中查找某一特定元素的搜索算法。先确定待查找元素所在的区间范围,在逐步缩小范围,直到找到元素或找不到该元素为止。

事例: 假设原始序列为array=[3, 12, 24, 31, 46, 48, 52, 66, 69, 79, 82],目标元素target=52。

代码:

def search(self, nums: List[int], target: int) -> int:
        left = 0
        right = len(nums) - 1
        # 在区间 [left, right] 内查找 target
        while left <= right:
            # 取区间中间节点
            mid = (left + right) // 2
            # 如果找到目标值,则直接返回中心位置
            if nums[mid] == target:
                return mid
            # 如果 nums[mid] 小于目标值,则在 [mid + 1, right] 中继续搜索
            elif nums[mid] < target:
                left = mid + 1
            # 如果 nums[mid] 大于目标值,则在 [left, mid - 1] 中继续搜索
            else:
                right = mid - 1
        # 未搜索到元素,返回 -1
        return -1

方法二:排除法思想

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left = 0
        right = len(nums) - 1
        # 在区间 [left, right] 内查找 target
        while left < right:
            # 取区间中间节点
            mid = left + (right - left + 1) // 2
            # nums[mid] 大于目标值,排除掉不可能区间 [mid, right],在 [left, mid - 1] 中继续搜索
            if nums[mid] > target:
                right = mid - 1 
            # nums[mid] 小于等于目标值,目标元素可能在 [mid, right] 中,在 [mid, right] 中继续搜索
            else:
                left = mid
        # 判断区间剩余元素是否为目标元素,不是则返回 -1
        return left if nums[left] == target else -1

2. 二分查找题目

LeetCode 704. 二分查找

https://leetcode-cn.com/problems/binary-search/

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left = 0
        right = len(nums)-1
        ans = -1
        while left <= right:
            mid = (left+right)//2
            if nums[mid] == target:
                ans = mid
                return ans
            if nums[mid] < target:
                left = mid+1
            else:
                right = mid-1
        return ans

在这里插入图片描述

LeetCode 374. 猜数字大小

https://leetcode-cn.com/problems/guess-number-higher-or-lower/

class Solution:
    def guessNumber(self, n: int) -> int:
        left = 1
        right = n
        while left <= right:
            mid = (right + left) // 2
            ans = guess(mid)
            if ans == 1:
                left = mid + 1
            elif ans == -1:
                right = mid - 1
            else:
                return mid
        return 0

LeetCode 35. 搜索插入位置

https://leetcode-cn.com/problems/search-insert-position/

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        n = len(nums)
        left = 0
        right = n - 1
        ans = n
        while left <= right:
            mid = left + (right - left) // 2
            if nums[mid] == target:
                return mid
            elif nums[mid] < target:
                left = mid + 1
            else:
                right = mid - 1

        return left

在这里插入图片描述

LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置

https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/

这道题如果按正常思路,从小到大找呗,然后找到输出就行。但是本题要求$O(logn)$

思想:

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:

        left = 0
        right = len(nums) - 1
        ans = [-1, -1]
        while left <= right:
            mid = (left + right) // 2
            if nums[mid] == target:
                nums.append(0.1)
                ans[0] = ans[1] = mid
                while (ans[0]-1>=0) and (nums[ans[0]-1] == target) :
                    ans[0] -= 1

                while (nums[ans[1]] == target) and ((ans[1]+1) <= len(nums)-1):
                    ans[1] += 1
                ans[1]= ans[1] -1

                return ans
            if nums[mid] < target:
                left = mid + 1
            else:
                right = mid - 1
        return ans

在这里插入图片描述

标签:03,right,target,nums,Python,mid,未完待续,int,left
来源: https://blog.csdn.net/wistonty11/article/details/121499196