常见算法
二分查找
二分查找的适用场景:数组元素有序且不重复
循环条件: left <= right
中间位置计算: mid = left + ((right -left) >> 1) ( 位运算 >> 1 即 除法运算 / 2)
左边界更新:left = mid + 1
右边界更新: right = mid - 1
返回值: mid 或 -1
实例:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
- 选取区间为[left, right],low = 0,right= numsSize -1为数组下标索引
- 如果nums[mid] == target不成立时,判断target的区间范围为[left, mid -1],还是[mid + 1, right]。其中mid = (right + left) / 2
- 选取边界值当 left == right t时,为数组最后一次需要判断的数据.
int searchInsert(int* nums, int numsSize, int target){
int left = 0;
int right = numsSize - 1;
int mid = 0;
while (left <= right) { // 循环条件
mid = left + (right - left) / 2; // 防止right + left溢出。等价于(right + left) / 2
// 或者mid = left + ((right -left) >> 1) ( 位运算 >> 1 即 除法运算 / 2)
if (nums[mid] == target) {
return mid;
} else if (nums[mid] > target) {
right = mid - 1; // target位于左区间 [left, mid -1]
} else {
left = mid + 1; // target位于右区间 [mid + 1, right]
}
}
return left;
}
参考链接
- https://leetcode-cn.com/problems/search-insert-position/