go算法排序系列-004二分排序

在一个有序数组中,查找某个数是否存在

在这里插入图片描述

func exist(sortedarr []int, num int) bool {
	temp := len(sortedarr)
	if sortedarr == nil || temp == 0 { // 剔除杂项
		return false
	}
	L := 0
	R := temp - 1
	mid := 0
	for L < R {
		mid = L + ((R - L) >> 1) // 这样写无论怎么样都不会越界
		if sortedarr[mid] == num { // 如果正好找到,直接返回
			return true
		} else if sortedarr[mid] > num { // 大了就往左走
			R = mid - 1
			fmt.Println(R)
		} else {
			L = mid + 1 // 小了就往右走
		}
	}
	return sortedarr[L] == num
}

时间复杂度

每一次都是折半查找,所以假设是0(N)的时间复杂度,那么就是2^n = O(N),那么时间复杂度就为O(logN)

空间复杂度

变量加起来也是O(1),没有重复的生成额外变量

在一个有序数组中,找>=某个数最左侧的位置

在这里插入图片描述

func nearetindex(arr []int, value int) int {
	temp := len(arr)
	L := 0
	R := temp - 1
	index := -1
	for L <= R {
		mid := L + ((R - L) >> 1)
		if arr[mid] >= value { // 如果中间这个值大于等于value,说明左侧有离他最近的值
			index = mid
			R = mid - 1
		} else {
			L = mid + 1
		}
	}
	return index
}
func nearestindex(arr []int, value int) int {
	temp := len(arr)
	L := 0
	R := temp - 1
	index := -1
	for L < R {
		mid := L + ((R - L) >> 1)
		if arr[mid] <= value {
			index = mid
			L = mid + 1
		} else {
			R = mid - 1
		}
	}
	return index
}

局部最小值问题

func getlessindex(arr []int) int {
	temp := len(arr)
	left := 1
	right := temp - 2
	mid := 0
	for left < right {
		// mid = (left + right) / 2
		mid = (left + right) >> 2
		if arr[mid] > arr[mid-1] {
			right = mid - 1
		} else if arr[mid] > arr[mid+1] {
			left = mid + 1
		} else {
			return mid
		}

	}
	return left
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值