题解 | #二分查找-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
}