二分法查找
题目场景:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
解决思路:
1、因为数组是有序的,我们可以考虑使用中间值与要被查找的数进行比较,如果相等就返回该中间值的下标,不相等就返回 -1
2、至于中间值的变化就可以使用两个指针(一个最左,一个最右)来表示,改变两个指针的位置就会改变中间值的位置
3、这下就会产生三种情况:
中间值 = 被查找的数 返回改中间值的下标
中间值 < 被查找的数 左边的指针右移就会增大中间值,继续比较
中间值 > 被查找的数 右边的指针左移就会减小中间值,继续比较
代码思路
两个指针分别为 left = 0,right = nums.length -1,开始 一个在最左边,一个最右边
中间值用 mid 表示 mid = (right - left) + left
当 left < right 程序就可以继续下去
当 left > right 程序结束
上代码:
public class BinarySearch {
public int search(int[] nums, int target) {
int left = 0;//左边的指针
int right = nums.length - 1;//右边的指针
while (left <= right) {
int mid = (right - left) / 2 + left;//中间值
if (nums[mid] == target) {
return mid;
}else if (nums[mid] < target) {//中间的数小于target,指针右移
left = mid + 1;
}else{//中间的数大于target,指针左移
right = mid -1;
}
}
return -1;
}
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9};
BinarySearch bs = new BinarySearch();
int search = bs.search(arr, 1);
System.out.println(search);
}
}