二分查找 Binary Search

二分查找:

int binarySearch(vector<int> &nums, int target)
{
	int left = 0;
	int right = nums.size() - 1;
	// 二分查找
	while (left <= right)
	{
		// 防止溢出
		int mid = left + ((right - left) >> 1);

		if (nums[mid] == target)
		{
			return mid;
		}
		else if (nums[mid] < target)
		{
			left = mid + 1;
		}
		else
		{
			right = mid - 1;
		}
	}
	return -1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

Binary Search 两大基本原则

  1. 每次都要缩减搜索区域 —— Shrink the search space every iteration (or recursion)
  2. 每次缩减不能排除潜在答案 —— Cannot exclude potential answers during each shrinking

三大模板

  • 找一个准确值
  • 循环条件:l <= r
  • 缩减搜索空间:l = mid +1 , r = mid -1
  • 找一个模糊值
    • 循环条件:l < r
    • 缩减搜索空间:l = mid , r = mid -1 或者 l = mid + 1, r = mid
  • 万用型
    • 循环条件:l < r - 1
    • 缩减搜索空间:l = mid , r = mid

备注:有时候mid = l + (r-l+1)/2,保证每次mid停在靠右的位置(对应奇偶的情况)

适用题型:

搜索插入位置
搜索旋转排序数组————即变形的二分查找,在局部具有排序性
1
2

vector操作

vector<int> vec = {1,2};//初始化
1

两数之和:

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

方法一:暴力枚举,两次for循环
方法二:哈希法,每次只需要判断 target-nums[i] 是否存在
1
2
3
4