二分查找——红蓝染色法


二分查找——红蓝染色法

nums =   [11, 13, 15, 17]
index  -1, 0,  1,  2,  3, 4

原则:

“原本想要处理的,等价于闭区间”;

“结束的原则是区间内没有元素”;

“答案是(L or R)排在后面的那个”。

二分查找的关键是区间定义结束条件。常见两种写法:

  1. 闭区间 [0, len-1]
    • 循环条件:left <= right
    • 结束时:right + 1 == left
    • 返回:left
  2. 开区间 (-1, len)
    • 循环条件:left + 1 < right
    • 结束时:left + 1 == right
    • 返回:right

34. 在排序数组中查找元素的第一个和最后一个位置

已解答

中等

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

示例 2:

输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]

示例 3:

输入:nums = [], target = 0
输出:[-1,-1]

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • nums 是一个非递减数组
  • -109 <= target <= 109

分析

二分查找原本是在有序数组里查找到目标值,那么第一个元素恰好就是“二分查找”可以查到的。关键是最后一个元素怎么查到?这里涉及到几种搭配,>=, >, <, <=。二分查找是>=,第二个元素可以转化为>=target+1,然后求出的index-1,即找到第一个大于target+1的元素,他的前一个就是这“第二个”元素;注意需要先判断第一个元素的索引是否存在。

利用二分查找找到第一个 ≥ target 的位置(即 lowerBound);

再找到第一个 ≥ target+1 的位置,减 1 即为最后一个等于 target 的位置;

注意检查 target 是否存在。

func lowerBound(nums []int, target int) int {
   
    //寻找有序数组里,第一个>= target的数字
	//开区间写法(-1,len)===> (L,R)
	left := -1
	right := len(nums)

	for left+1 < right 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jessie_waverider

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值