首页 > 其他分享 >二分法

二分法

时间:2023-05-22 16:48:23浏览次数:32  
标签:边界 nums mid 二分法 查找 left target

【二】二分法

二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。

  • 二分法查找的思路如下:

    • (1)首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。

    • (2)如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤的操作。

    • (3)如果某一步数组为空,则表示找不到目标元素。

以下是二分法常用的模板,包括查找指定数、查找左边界和右边界。

【1】查找指定数

  • 查找指定数是指只需要查找出指定数在数组中的索引即可,并不规定指定数在数组中所处的相对位置。
# -*-coding: Utf-8 -*-
# @File : 二分法 .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/5/22

def binary_Search(nums, target):
    left, right = 0, len(nums) - 1  # 搜索区间两边为闭
    while left <= right:  # 注意停止条件,停止条件为[left, left+1]
        mid = (right + left) // 2
        # 找到指定数并返回其索引
        if nums[mid] == target:
            return mid
        elif nums[mid] < target:
            left = mid + 1  # 因为mid已经搜索过
        else:
            right = mid - 1
    return -1


nums = [1, 8, 9, 7, 4, 5, 3, 1, 6]
target = 6
result = binary_Search(nums, target)
print(result)  # 8
# 6所在的索引位置正是 8

此处要注意的是:

  • while循环的条件left <= right代表中止条件为[left, left+1]。如果不加等号,则中止条件为[left,left]此时life并没有被搜索,是不正确的。

【2】左边界查找

  • 左边界查找是指需要查找出指定数在数组中第一次出现的位置的索引。
def left_Search(nums, target):
    left, right = 0, len(nums) - 1  # 搜索区间两边为闭
    while left <= right:
        mid = (right + left) // 2
        if nums[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    if left >= len(nums) or nums[left] != target:
        return -1
    return left


nums = [1, 8, 9, 7, 4, 5, 3, 1, 6]
target = 6
result = left_Search(nums, target)
print(result)  # 8
# 6所在的索引位置正是 8

此处要注意的是:

  • 主要是要理解左边界查找和查找指定数的区别,在查找指定数时nums[mid] == target表示已经找到指定数,则返回该数索引即为结果。而在左边界查找时nums[mid] == target并不能表示已经得到结果,因为我们不知道这个数是不是最左边的,所以当nums[mid] == target时我们要将右边界设置为mid - 1,再次进行循环。

【3】右边界查找

  • 右边界查找跟左边界类似,只不过右边界需要的是查找出最后一次出现的位置的索引。
def left_Search(nums, target):
    left, right = 0, len(nums) - 1  # 搜索区间两边为闭
    while left <= right:
        mid = (right + left) // 2
        if nums[mid] <= target:
            left = mid + 1
        else:
            right = mid - 1
    if right < 0 or nums[right] != target:
        return -1
    return right


nums = [1, 8, 9, 7, 4, 5, 3, 1, 6]
target = 6
result = left_Search(nums, target)
print(result)  # 8
# 6所在的索引位置正是 8

此处要注意的是:

  • 主要是要理解右边界查找和左边界查找的区别,在左边界查找时nums[mid] == target我们要去查找左边的区间是否有指定数,所以当nums[mid] == target时我们要将右边界设置为mid - 1,再次进行循环。而在右查找时我们要去查找右边的区间是否有指定数,所以当nums[mid] == target时我们要将左边界设置为mid - 1

标签:边界,nums,mid,二分法,查找,left,target
From: https://www.cnblogs.com/dream-ze/p/17421001.html

相关文章

  • 二分法
    本质在有序区间内,找到一个分界线,分界线左侧元素均不满足某一个性质,右侧则相反。极端情况下,左边和右边都可能为空。可以按照具体定义将分界线归属为左边或者右边。比如,上面的分界线0左侧都不大于0,右侧都大于0。先决条件区间内元素有序;区间左右端点确定。题目特点求......
  • 1241.二分法求函数零点 | 浮点二分
    1241二分法求函数的零点题目来源信息学奥赛一本通题目描述\(有函数:f(x)=x5−15x4+85x3−225x2+274x−121.已知f(1.5)>0,f(2.4)<0且方程f(x)=0在区间[1.5,2.4]有且只有一个根,请用二分法求出该根。\)输出要求\(该方程在区间[1.5,2.4]中的根。要求四舍五入到小数点后6位。\)......
  • 查找(1.顺序查找、2.二分法查找)
    顺序查找既是for循环,在循环内用if匹配输入的值是否有对等,有即返回对应结果如果for循环下,没有对应的匹配值,要返回提示没找到用如下方法二分法查找1.必须是一个有序的列表2.先找到数组的中间值,拿输入值与其配对3.如果值是小了往左边选中间值,再匹对。反之向右.........
  • 二分法查找子序列
    判断子序列二分思路主要是对t进行预处理,用一个字典index将每个字符出现的索引位置按顺序存储下来intm=s.length(),n=t.length();vector<vector<int>>index(256,vector<int>());//先记下t中每个字符出现的位置for(inti=0;i<n;i++){charc=t[i];......
  • 分巧克力(二分法)
    题目描述儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。小明一共有N块巧克力,其中第i块是Hi×Wi的方格组成的长方形。为了公平起见,小明需要从这N块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足:形状是正方形,边长是整数;......
  • 二分法
    关于二分法:二分法使用要求待查找的数据集必须有序二分法的缺陷针对开头结尾的数据查找效率很低常见算法的原理以及伪代码二分法、冒泡、快拍、插入、堆排、桶排、数......
  • 算法—二分法详解
    二分法详解目录二分法详解1.二分法2.引论:猜数游戏3.整数域二分1、在单调递增序列中找x或者x的后继2、在单调递增序列中查找x或者x的前驱3.简易二分模板4.浮点数二......
  • python实现一个二分法
    #################      ############################### ......
  • 二分法:区间的重要性(初探)
    哈喽,我是404,正在努力提升代码能力的未来女程序员(笑),这是我的第一篇博客,接下来会记录我的学习之路到我力扣完全可以手撕,废话不多说,正文开搞!通过初见力扣经典题目704.二......
  • python实现一个二分法
    #################                 ############################### #########################......