各自努力,最高处见!加油!
二分查找
func search(nums []int, target int) int {
var begin = 0
var end = len(nums) - 1
mid := (begin + end) / 2 //中点
for mid != begin && mid != end {
if nums[mid] <= target {
begin = mid
} else {
end = mid
}
mid = (begin + end) / 2
}
if nums[begin] == target {
return begin
} else if nums[end] == target {
return end
}
return -1
}
维护了范围起始和末尾两个变量,不断缩小目标值所在的范围。
存在问题:如果这个target值在数组中不存在,也会进行代码运算。
优化方向:由于这是一个顺序数组,可以通过数组的首变量和末变量判断该target值是否存在于数组中。
第一个错误版本
/**
* Forward declaration of isBadVersion API.
* @param version your guess about first bad version
* @return true if current version is bad
* false if current version is good
* func isBadVersion(version int) bool;
*/
func firstBadVersion(n int) int {
begin:=1
end:=n
mid:=(begin+end)/2
for mid!=begin&&mid!=end{
if isBadVersion(mid) {
end=mid
}else{
begin=mid
}
mid=(begin+end)/2
}
if isBadVersion(begin) {
return begin
}else {
return end
}
}
搜索插入位置
func searchInsert(nums []int, target int) int {
begin := 0
end := len(nums)-1
mid := (begin + end) / 2
if nums[begin]>target {
return 0
}
if nums[end]<target{
return end+1
}
for mid != begin && mid != end {
if nums[mid] > target {
end = mid
} else if nums[mid] == target {
return mid
} else {
begin = mid + 1
}
mid = (begin + end) / 2
}
if nums[begin] >= target {
return begin
} else {
return end
}
}
go语言的官方题解
func searchInsert(nums []int, target int) int {
n := len(nums)
left, right := 0, n - 1
ans := n
for left <= right {
mid := (right - left) >> 1 + left
if target <= nums[mid] {
ans = mid
right = mid - 1
} else {
left = mid + 1
}
}
return ans
}
纠错:go语言的非ing类型给int类型赋值不是使用四舍五入法,而是向下取整