import java.util.*;

//对于有序数组的二分法查找
//就是缩小范围,每次都折半,
1.第一次把整个数组分成俩段,
2.依据这个middle中间指针位置元素去比较目标值,看目标值是在他之前还是之后,
3.依据这个比较去修改first 或者 last指针
再去取这个新的数组(就是折半之后的数组)的中间值,然后再去比较,依次操作123
因为要找第一次出现,所以一直比较直到first和last重合
判断first指针位置的元素是不是目标值是就返回first ,不是就返回-1
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 如果目标值存在返回下标,否则返回 -1
* @param nums int整型一维数组
* @param target int整型
* @return int整型
*/
public int search (int[] nums, int target) {
//1.首先判断 nums是否为空 或者没有数据
if(nums==null||nums.length==0){
return -1;
}
//2.初始化俩边指针,二分法就是把数组给折半去查找,因为有序
int first=0;
int last=nums.length-1;
//3.判断这个开始指针 小于为指针
while(first<last){
//3.1取中间指针
int middle=(first+last)/2;
//3.2中间指针位置的元素去和目标元素比较

        //如果中间元素大于目标数  证明这个数应该在中间指针之前的位置
        //那就把尾指针last变成middle-1
        if(nums[middle]>target){
            last=middle-1;
        }
        //如果中间元素小于目标数  证明这个数应该在中间指针之后的位置
        //那就把头指针first变成middle+1
        else if(nums[middle]<target){
            first=middle+1;
        }
        //如果这个middle指针位置元素等于目标值,那就把middle位置设置成last 
        //因为这个数组有序,要找目标元素第一次出现位置,这个middle不一定是第一次出现
        //然后再去折半去判断改变first值 ,直到first=last,那就说明这个位置是第一次
        else{
            last=middle;
        }
    }
    if(nums[first]==target){
        return first;
    }
     return -1;
}

}