浅谈二分查找

本文深入探讨了二分查找算法的两种主要应用场景:一种是在有序数组中查找特定元素并返回其首次或最后一次出现的位置;另一种是在未找到目标值时,确定其在数组中的插入位置。通过两个模板函数bSearch_1和bSearch_2,分别实现了查找大于等于目标值的最小下标和小于等于目标值的最大下标的功能,并提供了测试案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浅谈二分查找

二分查找的查找问题 — 两套查找模板
1.查找是:大于等于target的最小下标 arr[mid] >= target
2.查找是:小于等于target的最大下标 arr[mid] <= target

二分查找题目有两种类型:

  • 情况一:在某个数组中查找某个数字(能找到),返回下标。
    • 如果target只出现一次,返回target
    • 如果target出现1+次,返回:
      • target首次出现的位置
      • target最后出现的位置
  • 情况二:在某个数组中查找某个数字(找不到)
    • 直接返回-1。
    • 返回它可以插入的位置,即大于target的最大下标
    • 返回小于target的最大下标(特殊情况可能会使用这种方式) ---- leetcode 911 在线选举
/*
bSearch_1:用于在一个数组中找到大于等于target的最小下标
*/
int bSearch_1(vector<int> nums, int target) {
	int left = 0;
	int right = nums.size() - 1;
	int ans = nums.size(); // 防止nums为空出现随机值
	while (left <= right) {
		int mid = (right - left) / 2 + left;
		// mid = (l+r)>>1;
		if (nums[mid] >= target)	{
			ans = mid;
			right = mid - 1;
		} else {
			left  = mid + 1;
		}
	}
	return ans;
}

/*
bSearch_2:用于在一个数组中找到小于等于target的最大下标
*/
int bSearch_2(vector<int> nums, int target) {
	int left = 0;
	int right = nums.size() - 1;
	int ans = nums.size();
	while (left <= right) {
		int mid = (right - left) / 2 + left;
		if (nums[mid] <= target)	{
			ans = mid;
			left = mid + 1;
		} else {
			right = mid - 1;
		}
	}
	return ans;
}

测试用例

int main(void) {
	vector<int> v1 = {1, 4, 5, 6, 6, 6, 8, 9};
	cout << bSearch_1(v1, 3) << endl;
	cout << bSearch_2(v1, 3) << endl;
	return 0;
}

输出:
1
0
int main(void) {
	vector<int> v1 = {1, 4, 5, 6, 6, 6, 8, 9};
	cout << bSearch_1(v1, 6) << endl;
	cout << bSearch_2(v1, 6) << endl;
	return 0;
}

输出:
3
5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值