1、题目描述
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
2、算法思路
根据题目是一个有序的数列,查找一个目标数,我们可以使用二分查找。
3、算法流程
定义left = 0和right = nums.length; 这样定义表示right 指针指向的区间不在取值范围,所以while(left<right ) 这里是不用等号的,下面当在中间值的左边right移动也不用-1,因为right不在取值范围,简单来说就是左闭右开。
4、算法代码
其实这两个代码是一样的,主要是我们要区分好right=nums.length-1和不right不需要-1的差别。
如果减-1,表示right这个指针下的的数值参与比较,如果不减一表示right这个指针下不参与比较。具体详细的可以看基础数据结构-006-二分查找-改动版_哔哩哔哩_bilibili这个视频
class Solution {
public int search(int[] nums, int target) {
int left = 0,right = nums.length;
while (left < right){
int mid = (left + right) >>>1;
if (target < nums[mid]){//在中间值的左边,right移动
right = mid;
} else if (nums[mid] < target) {
left = mid + 1;
}else {
return mid;
}
}
return -1;
}
}
class Solution {
public int search(int[] nums, int target) {
int left = 0,right = nums.length -1;
while (left <= right){
int mid = (left + right) >>>1;
if (target < nums[mid]){//在中间值的左边,right移动
right = mid-1;
} else if (nums[mid] < target) {
left = mid + 1;
}else {
return mid;
}
}
return -1;
}
}