704. 二分查找

给定一个 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

求中点位置:

 int mid=L+((R-L)>>1);

非递归实现:

public int search(int[] nums, int target) {
        if(nums==null){
            return -1;
        }
        int L=0;
        int R=nums.length-1;
        while(L<=R){
            int mid=L+((R-L)>>1);
            if(nums[mid]==target){
                return mid;
            }else if(nums[mid]<target){
                L=mid+1;
            }else{
                R=mid-1;
            }
        }
        return -1;
    }

  

递归实现:

class Solution {
    public int search(int[] nums, int target) {
        if(nums==null){
            return -1;
        }
        return process(nums,target,0,nums.length-1);
       
    }
    //在L....R位置上求等于target值的位置
    public int process(int[] nums,int target,int L,int R){
        //base case
        if(L>R){
            return -1;
        }
        int mid=L+((R-L)>>1);
        if(nums[mid]==target){
            return mid;
        }else if(nums[mid]<target){
            return process(nums,target,mid+1,R);
        }else{
            return process(nums,target,L,mid-1);
        }
    }
}

  

 搜索 nums 中的 target最左的位置

示例:[1,2,2,2,2,3,3,4,4,5,6]  target=2

思路:二分的扩展,一直二分到边界结束

当有遇到等于target的位置时,记录一下这个位置,再继续往左二分,返回记录的位置就是等于指定值的最左位置

class Solution {
    public int search(int[] nums, int target) {
        if(nums==null){
            return -1;
        }
        return process(nums,target,0,nums.length-1,-1);
       
    }
    //在L....R位置上求等于target值出现的最左位置
    public int process(int[] nums,int target,int L,int R,int flag){
       if(L>R){
           return flag;
       }
       int mid=L+((R-L)>>1);
     
       if(nums[mid]>=target){
           if(nums[mid]==target){
             flag=mid;
           }
         flag = process(nums,target,L,mid-1,flag);
       }else{
         flag=process(nums,target,mid+1,R,flag);
       }
       return flag;
    }
}

  

 搜索 nums 中的 target最右的位置

示例:[1,1,1,2,3,3,4,4,4,4,5]  target=4

思路:二分的扩展,一直二分到边界结束

当有遇到等于target的位置时,记录一下这个位置,再继续往左二分,返回记录的位置就是等于指定值的最左位置

class Solution {
    public int search(int[] nums, int target) {
        if(nums==null){
            return -1;
        }
        return process(nums,target,0,nums.length-1,-1);
       
    }
    //在L....R位置上求等于target值出现的最右位置
    public int process(int[] nums,int target,int L,int R,int flag){
       if(L>R){
           return flag;
       }
       int mid=L+((R-L)>>1);
       if(nums[mid]<=target){
           if(nums[mid]==target){
                flag=mid;
           }
           flag=process(nums,target,mid+1,R,flag);
       }else{
           flag=process(nums,target,L,mid-1,flag);
       }
       return flag;
     
    }
}

  

 

posted @ 2021-09-03 11:39  sherry001  阅读(52)  评论(0)    收藏  举报