题解 | #二分查找-Go语言实现#

二分查找-II

http://www.nowcoder.com/practice/4f470d1d3b734f8aaf2afb014185b395

概述

我所实现的二分查找算法的代码,有两种代码实现方式。分别是函数递归调用和循环二分查找的方式。二者的不同在于,基于函数递归调用的方式,优势是代码实现直观且简单,仅需要按查找要求不断调用search函数进行不断查询即可,缺点是内存空间占用量大。基于循环二分查找的方式,缺点是没有递归调用实现那么简单,实现过程中很容易出现某一处条件遗漏考虑的情况,但是优势在于内存空间占用量小

具体二者代码如下:

基于递归调用实现二分的方式:

func search( nums []int ,  target int ) int {
    // write code here
    n:=len(nums)
    if n==0{
        return -1
    }
    if n>=2{
       k:=n/2
       left:=nums[:n/2]
        if re:=search(left,target);re!=-1{
            return re
        }
        right:=nums[n/2:]
        if re:=search(right,target);re!=-1{
            return re+k
        }
    }
    if target==nums[0] {
        return 0
    }else{
        return -1
    }
}

基于循环实现二分查找的方式:

func search( nums []int ,  target int ) int {
    // write code here
    n:=len(nums)
    if n==0{
        return -1
    }
    left:=0;
    right:=n-1
    mid:=(left+right)/2
    for n>1{
        if mid -1>=0{
            if target==nums[mid] && target>nums[mid-1] {
                return mid
            }
        }else if target==nums[mid]{
            return mid;
        }
        if (left+right) %2!=0{
           if target==nums[mid+1] && target > nums[mid]{
               return mid+1
            }
        }
        if nums[mid]<target{
            left=mid
        }else {
            right=mid
        }
        mid=(left+right)/2
    }
    return -1
}
全部评论

相关推荐

06-15 18:44
黄淮学院 Java
Lynn012:如果是居民楼还是算了吧,看着有点野呢
点赞 评论 收藏
分享
屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务