给定一个 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)
此题何解?
思路:二分查找,就是将数组一分为二,left表示数组的最左端,right表示数组的最右端,mid就是这个数组的中间。
如果要查找的目标 target > mid ,说明目标值在这个数组的右半部分,接下来就好办了,将left = left + 1,这样就会将范围逐渐缩小,(想象一下,数组的左端一直在向中间移动);
如果target < mid,说明目标值在数组的左半部分,那么就让right = right - 1,同上。
代码部分:
int search(int* nums, int numsSize, int target)
{
int left = 0;
int right = numsSize - 1;
while(left <= right)//为什么要加等号?因为有一种情况是“[5]”,这种只有一个元素的数组
{
int mid = left + (right - left) / 2;
if(nums[mid] < target)
{
left = mid + 1;
mid = (right - left) / 2;
}
if(nums[mid] > target)
{
right = mid - 1;
mid = (right - left) / 2;
}
if(nums[mid] == target)
{
return mid;
}
}
return -1;
}