芝士算法(二分查找篇 1.0)

二分查找 可以说是我们最先了解的算法之一

目录

二分查找

在排序数组查找元素的第一个和最后一个位置

​编辑

X的平方根

搜索插入的位置


二分查找

二分查找

java 复制代码
public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length -1 ;
        while(left <= right){
            int mid = left + (right - left) / 3;//防溢出
            if(nums[mid] < target)
            left = mid + 1;
            else if(nums[mid] > target)
            right = mid - 1;
            else
            return mid;
        }
        return -1;
    }

此外 在计算mid方法中 不仅局限于除以 2 本质要减小要查找的范围

已达到O(log n) 时间复杂度的算法

在排序数组查找元素的第一个和最后一个位置

在排序数组查找元素的第一个和最后一个位置

java 复制代码
public int[] searchRange(int[] nums, int target) {
        int [] ret = new int [2];
        ret[0] = ret[1] = -1;
        //处理边界
        if(nums.length == 0)
        return ret;
        
        //寻找左端点
        int left = 0,right = nums.length - 1;
        while(left < right){
            int mid = left + (right - left) / 2;
            if(nums[mid] < target)
            left = mid + 1;
            else
            right = mid;
        }

        //判断结果
        if(nums[right] != target)
        return ret;
        else
        ret[0] = left;

        //寻找右端点
        left = 0;
        right = nums.length - 1;
          while(left < right){
            int mid = left + (right - left + 1) / 2;
            if(nums[mid] > target)
            right = mid - 1;
            else
            left = mid;
            
        }

        //判断结果
        if(nums[left] != target)
        return ret;
        else
        ret[1] = right;

        return ret ;


    }

X的平方根

X的平方根

java 复制代码
 public int mySqrt(int x) {
     //不存在时
     if(x< 1)
     return 0;
     long left = 0 , right = x;
     while(left < right){
        long mid  =  left + (right - left + 1 ) / 2;
        if( mid * mid <= x)
            left = mid;
        else if(mid * mid > x)
          right = mid - 1;
          //此时 left == right == mid 
     }
     return(int) left;
    }

搜索插入的位置

搜索插入的位置

java 复制代码
public int searchInsert(int[] nums, int target) {
        int left = 0;
        int right = nums.length ;
        while(left < right){
            int  mid = left + (right - left)/2;
            if(nums[mid] < target)
            left = mid + 1;
            else
            right = mid;
        }
        return left;

    }