二分问题模板

文章提供了几个Go语言实现的函数,包括使用二分查找法检查数组中是否存在特定目标值,以及找到小于等于或大于等于目标值的最邻近元素的索引。此外,还定义了一个函数用于寻找数组中的局部最小值,确保数组相邻元素不相等。
摘要由CSDN通过智能技术生成

查看数组是否存在target


func exist(arr []int, target int) bool {
   L := 0
   R := len(arr) - 1
   for L < R {
      mid := L + (R - L) >> 1
      if arr[mid] == target {
         return true
      } else if arr[mid] > target {
         R = mid - 1
      } else {
         L = mid + 1
      }
   }

查找≤target最左边元素的index

func nearestIndex1(arr []int, target int) int {
   L := 0
   R := len(arr) - 1
   index := -1
   for L <= R {
      mid := L + (R - L) >> 1
      if arr[mid] >= target {
         index = mid
         R = mid - 1
      } else {
         L = mid + 1
      }
   }
   return index
}

查找≥target最右边元素的index

func nearestIndex2(arr []int, target int) int {
	L := 0
	R := len(arr) - 1
	index := -1
	for L <= R {
		mid := L + (R - L) >> 1
		if arr[mid] <= target {
			index = mid
			L = mid + 1
		} else {
			R = mid - 1
		}
	}
	return index
}

局部最小值

给定数组arr,大小为N。每个元素相邻的元素都不相等,以下情况可以称为局部最小量:

  1. arr[0] < arr[1],arr[0]为局部最小。
  2. arr[n - 1] < arr[n - 2],arr[n -1]为局部最小。
  3. arr[i] < arr[i + 1] && arr[i] < arr[i - 1],arr[i]为局部最小。
func localmin(arr []int) int {
	n := len(arr)
	if n == 0 {
		return -1
	}
	if n == 1 || arr[0] < arr[1] {
		return arr[0]
	}
	if arr[n - 1] < arr[n - 2] {
		return arr[n -1]
	}
	L := 1
	R := n - 2
	for L < R {
		mid := L + (R - L) >> 1
		if arr[mid] < arr[mid + 1] && arr[mid] < arr[mid - 1] {
			return arr[mid]
		} else if arr[mid] > arr[mid - 1] {
			R = mid - 1
		} else {
			L = mid + 1
		}
	}
	return arr[L]
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值