题目:
给定一个 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
解题思路:
定义左右指针left,right和数组nums,left指针指向数组下标为0的数,即left=0,right指向数组的最后一个元素,即right=nums.length-1。
接下来在left<=right时进入循环,定义中间值mid=left+(right-left)/2,首先这个式子和mid=(right+left)/2相等,如果使用后者式子的话可能会造成溢出,因为如果两个数是int类型的最大值和int类型的最大值减一,两值相加就溢出了。判断mid是否等于目标值target,相等则返回,否则判断target的值是否大于mid,大于则说明target在由mid划分后的数组的右边区域,将left=mid+1,
反之将right=mid-1,(因为我们是在[left,right]这个闭区间里找的),最后将找到的值返回。
代码 显示:
package das;
import java.util.Scanner;
public class BinarySearch11 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("你想输入多少个数:");
int n = sc.nextInt();
int[] arr=new int[n];
System.out.println("输入"+n+"个升序的数:");
for (int i = 0; i < arr.length; i++) {
arr[i]=sc.nextInt();
}
System.out.println("输入target:");
int target = sc.nextInt();
System.out.println(target+"在数组中的下标是"+Search(arr,target));
}
public static int Search(int[] arr,int target){
//定义左指针
int left=0;
//定义右指针
int right=arr.length-1;
while (left<=right){
//定义中间值mid
int mid=left+(right-left)/2;
//如果相等直接返回
if (target==arr[mid]){
return mid;
//大于说明target在右区域
}else if (target>arr[mid]){
left=mid+1;
//小于说明target在左区域
}else if (target<arr[mid]){
right=mid-1;
}
}
//没有找到就返回-1
return -1;
}
}