美文网首页
二分查找(下)

二分查找(下)

作者: leejnull | 来源:发表于2020-03-05 09:23 被阅读0次

4种常见的二分查找变形问题

  1. 查找第一个值等于给定值的元素
  2. 查找最后一个值等于给定值的元素
  3. 查找第一个大于等于给定值的元素
  4. 查找最后一个小于等于给定值的元素

查找第一个值等于给定值

这里都默认数据是从小到达有序排序。

def search_first_equal(array, value):
    low = 0
    high = len(array) - 1
    while low <= high:
        mid = low + ((high-low)>>1)
        if array[mid] == value:
            if mid == 0 or array[mid-1] != value:
                return mid
            else:
                high = mid - 1
        elif array[mid] < value:
            low = mid + 1
        else:
            high = mid - 1

    return -1

思路是在找到mid的值等于value时,我们要知道mid之前是否有相同值的数据,那怎么判断呢:如果mid==0,那么说明在它前面没有元素了, 返回mid;如果mid前一个元素不等于value,那么该mid就是对应第一个值的元素位置。

查找最后一个值等于给定值的元素

def search_last_equal(array, value):
    low = 0
    high = len(array) - 1
    while low <= high:
        mid = low + ((high-low)>>1)
        if array[mid] == value:
            if mid == len(array)-1 or array[mid+1] != value:
                return mid
            else:
                low = mid + 1
        elif array[mid] < value:
            low = mid + 1
        else:
            high = mid - 1

    return -1

这个就很简单了,理解了前面的思路就行。

查找第一个大于等于给定值的元素
def search_first_greater_or_equal(array, value):
    low = 0
    high = len(array) - 1
    while low <= high:
        mid = low + ((high-low)>>1)
        if array[mid] >= value:
            if mid == 0 or array[mid-1] < value:
                return mid
            else:
                high = mid - 1
        else:
            low = mid + 1

    return -1

查找最后一个小于等于给定值的元素

def search_last_less_or_equal(array, value):
    low = 0
    high = len(array) - 1
    while low <= high:
        mid = low + ((high-low)>>1)
        if array[mid] <= value:
            if mid == len(array) - 1 or array[mid+1] > value:
                return mid
            else:
                low = mid + 1
        else:
            high = mid - 1

    return -1

来自 https://leejnull.github.io/2020/03/04/2020-03-04-01/

相关文章

  • SearchInRotatedAry

    其实这个问题,是基于二分查找(BinarySearch)来解决的。所以这里需要先理解一下二分查找。 1. 二分查找...

  • 数据结构与算法系列——二分查找

    二分查找算法的简单介绍 今天我们来学习一下二分查找算法,也叫做折半查找算法。使用二分查找算法的前提是数据需要是有序...

  • 查询算法

    1、二分查找 二分查找的时间复杂度是O(logn),查找数据的效率非常高。不过,并不是什么情况下都可以用二分查找,...

  • python二分查找算法

    文章概述 二分查找法介绍 简单查找与二分查找对比 二分查找  二分查找算法主要思想:在有序列表中查找指定元素,先从...

  • 数据结构和算法--二分查找

    二分查找 二分查找的思想 二分查找(Binary Search)算法,也叫折半查找算法。 二分查找针对的是一个有序...

  • 二分查找算法--Python语言描述

    当列表的数据是有序的情况下, 使用二分查找算法是非常高效的, 以下使用两种方式实现了二分查找。 二分查找的一般算法...

  • 二分查找

    [TOC] 二分查找的基础模板 二分查找靠左的Index基础模板 二分查找靠右的Index基础模板 二分查找插入t...

  • 二分查找法

    二分查找法 二分查找法(递归)

  • 二分查找(递归、非递归)

    二分查找(递归) 二分查找(非递归)

  • 二分查找(递归、非递归)

    二分查找(递归) 二分查找(非递归)

网友评论

      本文标题:二分查找(下)

      本文链接:https://www.haomeiwen.com/subject/jgbblhtx.html