给定一个 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。