原题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目描述:
给定一个 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]
之间。
思路:
因为已知数组是有序且每一个元素都是不重复的,所以使用二分查找。
通过left和right两个指针作为边界,用第三个指针res取值。
注意边界判断,若是全闭区间,那么判断语句里必须为while(left>=right)因为left=right对于闭区间有意义,而且当nums[res]>target后,一定要使right=res-1、当nums[res]<target后,一定要使left=res+1。
代码:
int search(int* nums, int numsSize, int target){
int left=0,right=numsSize-1;
int res;
while(left<=right)
{
res=(right+left)/2;
if(nums[res]>target)
{
right=res-1;
}
else if(nums[res]<target)
{
left=res+1;
}
else return res;
}
return -1;
}
时间复杂度:
显然时间复杂度为:O(log2(n))。