二分查找算法
二分查找是一种在有序数组中查找目标值的效率较高的算法。
算法概述
二分查找通过重复地比较被检索元素与数组中间元素,来将查找范围分成两半,从而找出目标值。它的每一次迭代都可以将查找范围减半。因此使用对数时间复杂度来解决问题。
区间定义
二分查找的区间定义有两种:
- 左闭右闭:left索引包括在内,right索引不包括在内。如[left, right)
- 左闭右开:left索引包括在内,right索引也包括在内。如[left, right]
算法过程
无论区间定义是何种,算法过程保持以下步骤:
- 设置左右边界初始值 left 和 right
- 计算中间索引 mid = (left + right) / 2
- 检查元素 nums[mid] 是否为目标值 target
- 如果大于 target,移动right = mid - 1
- 如果小于 target, 移动 left = mid + 1
- 如果等于 target,则找到目标值,返回mid索引
- 持续步骤2-6,直到 left > right 跳出循环
- 如果没有找到则返回-1
代码
//左闭右闭
public class Solution
{
public int Search(int[] nums, int target)
{
int left = 0;
int right = nums.Length - 1;
while (left <= right)
{
int mid = (right - left) / 2 + left;
if (nums[mid] == target)
{
return mid;
}
else if (nums[mid] < target)
{
left = mid + 1;
}
else if (nums[mid] > target)
{
right = mid - 1;
}
}
return -1;
}
}
//左闭右开
public class Solution
{
public int Search(int[] nums, int target)
{
int left = 0;
int right = nums.Length;
while (left < right)
{
int mid = (right - left) / 2 + left;
if (nums[mid] == target)
{
return mid;
}
else if (nums[mid] < target)
{
left = mid + 1;
}
else if (nums[mid] > target)
{
right = mid;
}
}
return -1;
}
}
注意点
- 每次迭代都保持区间不变量来移动left和right边界
- 针对不同的区间定义做对应处理
- 退出循环条件为left > =right或left>right
以上就是二分查找算法的基本过程和实现方式。它通过对数时间复杂度O(log(n))高效查找目标值。