题目:给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
思路:
- 初始化左指针 left 和右指针 right,分别指向数组的开头和结尾。
- 当 left <= right 时,执行以下操作: a. 计算 mid = (left + right) // 2,表示中间位置的索引。 b. 如果 nums[mid] == target,则直接返回 mid。 c. 如果 nums[mid] > target,则说明 target 只可能出现在左半边,将 right 指针移动到 mid - 1。 d. 如果 nums[mid] < target,则说明 target 只可能出现在右半边,将 left 指针移动到 mid + 1。
- 如果 while 循环结束仍未找到 target,则说明不存在,返回 -1。
注意:边界范围的取值,是左闭右开[ ),还是左闭右闭[ ]。
左闭右闭[ ],代码如下:
public int search(int[] nums, int target) {
//首先给出的数组是一个有序数组,从小到大,升序
int mid=(nums.length-1)/2;
int left=0;
int right=nums.length-1;
while(true){
if(left>right){
return -1;
}
if(target>nums[mid]){
left=mid+1;
mid=(right+left)/2;
}
if(target<nums[mid]){
right=mid-1;
mid=(right+left)/2;
}
if(target==nums[mid]){
return mid;
}
}
}
左闭右开[ ),代码如下:
public int search(int[] nums, int target) {
//首先给出的数组是一个有序数组,从小到大,升序
int mid=(nums.length-1)/2;
int left=0;
int right=nums.length;
while(true){
if(left>=right){
return -1;
}
if(target>nums[mid]){
left=mid+1;
mid=(right+left)/2;
}
else if(target<nums[mid]){
right=mid;
mid=(right+left)/2;
}
else if(target==nums[mid]){
return mid;
}
}
}