给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
提示:
你可以假设 nums 中的所有元素是不重复的。
n 将在 [1, 10000]之间。
nums 的每个元素都将在 [-9999, 9999]之间。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
int search(int* nums, int numsSize, int target){
int i=0,mid=0,left=0,right=numsSize-1;
mid=(left+right)/2;
/*if(numsSize<=2)
{
for(i=0;i<numsSize;i++)
{
if(nums[i]==target)
return i;
}
return -1;
}
if(nums[mid]==target)
return mid;*/
while(left<right)
{
mid=(left+right)/2;
if(target<=nums[mid])
right=mid;
else
left=mid+1;
}
if(nums[left]==target)
return left;
return -1;
}
二分法模板:
模板一:
int lower_bound(int* nums, int numsSize, int target){
int left = 0;
int right = numsSize-1;
while(left < right){ // 搜索区间[first, last)不为空
// 防溢出
int mid = left + right >> 1;
if(nums[mid] >= target) right = mid;
else left = mid + 1;
}
return left; // right也行,因为[left, right)为空的时候它们重合
}
模板二:
int lower_bound(int* nums, int numsSize, int target){
int left = 0;
int right = numsSize-1;
while(left < right){ // 搜索区间[first, last)不为空
// 防溢出
int mid = left + right + 1 >> 1; // 防止死循环,mid加1
if(nums[mid] <= target) left = mid;
else right = mid + 1;
}
return left; // right也行,因为[left, right)为空的时候它们重合
}
模板一:区间 [left, right] 划分成 [left, mid] 和 [mid + 1, right] 时,其更新操作是 right = mid 或者 left = mid + 1;,计算 mid 时不需要加 1。
模板二:区间 [left, right] 划分成 [left, mid - 1] 和 [mid, right] 时,其更新操作是 r = mid - 1 或者 l = mid;,此时为了防止死循环,计算 mid 时需要加 1。