码迷,mamicode.com
首页 > 编程语言 > 详细

二分算法 再次理解

时间:2020-01-30 12:44:23      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:自己   详细介绍   理解   return   end   www   大于   返回值   dex   

二分算法 再次理解

详解二分查找算法

这篇博客很详细介绍了二分算法的一些细节问题

寻找一个数,也是最基本的二分搜索

//代码示例如下
int bsearch(int []nums, int target)
{
    int left=0, right=nums.length-1;//这里的数组长度用法可以是其他的形式
    while(left<=right)
    {
        int mid = left + (right - left) / 2;
        if(num[mid] == target)
            return mid;
        else if(num[mid] > target)
            right = mid - 1;
        else left = mid + 1;
    }
    return -1;//没有找到
}

寻找左侧边界的二分搜索

这里的代码实现和lower_bound(begin,end+1, target)相同,都是找到第一个大于等于target的数组下标。

int left_bound(int[] nums, int target)
{
    if(nums.length == 0) return -1;
    int left = 0, right = nums.length; //注意这里的边界设置是左闭右开的。
    while(left < right)
    {
        int mid = left + (right - left) / 2;
        if(nums[mid] >= target)
            right = mid;//有边界进行压缩,依旧保持左开右闭的形式
        else left = mid+1;
    }
    return left; //注意这里的left不一定是准确位置,这里的left有特殊含义
}
nums: 1 2 2 4
index: 0 1 2 3

如果使用这个左侧二分搜索2,那么将会返回1,表示在nums数组中有一个元素小于2,其他的类似。但是这样也存在一些问题,如果我们搜索1或者-1的时候,返回的值都是0,但是两者的含义是不同的,所以再收到结果后需要进行判断,以免出错。当然这里如果搜索的值为8的时候返回为值为4,也就是数组最后一个元素的下一个元素,这里也需要进行注意。

寻找右侧边界的二分查找

int right_bound(int[] nums, int target)
{
    if(nums.length==0) return -1;
    int left = 0, right = nums.length;
    whlie(left < right)
    {
        int mid = left + (right - left) / 2;
        if(nums[mid] <= target)
            left = mid + 1; //左边界进行压缩
        else right=mid; //右边都是直接等于mid
    }
    return left - 1;//这里有点不同,这里需要进行减一,特殊需要进行记忆。
}

这里的注意点就是返回值需要进行减一

这篇文章是自己看到那篇博客的一些领会,详细参阅还是需要看看原文章,链接再最上面

二分算法 再次理解

标签:自己   详细介绍   理解   return   end   www   大于   返回值   dex   

原文地址:https://www.cnblogs.com/alking1001/p/12242408.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!