剑指Offer——二分查找算法_二分搜索 边界 剑指offer

System.out.println(binarySearchRecursionNon(array, 7, array[0], array[len-1]));
}
/**

  • 二分查找(递归)

  • @param arry 递增数组

  • @param value 待查找数值

  • @param start 起始查找位置

  • @param end 末查找位置

  • @return
    */
    private static int binarySearchRecursion(int arry[],int value,int start,int end)
    {
    if(start > end)
    return -1;

    int mid=start + (end-start)/2;
    if(arry[mid] == value)
    return mid;

    else if(value < arry[mid])
    {
    end = mid - 1;
    return binarySearchRecursion(arry,value,start,end);
    }
    else
    {
    start = mid + 1;
    return binarySearchRecursion(arry,value,start,end);
    }
    }
    /**

  • 二分查找(非递归)

  • @param arry 递增数组

  • @param value 待查找数值

  • @param start 起始查找位置

  • @param end 末查找位置

  • @return
    */
    private static int binarySearchRecursionNon(int arry[],int value,int start,int end)
    {
    while(start <= end){
    int mid=start + (end-start)/2;

    if(arry[mid] == value)
    return mid;

    else if(value < arry[mid])
    {
    end = mid - 1;
    }

    else
    start = mid + 1;
    }
    return -1;
    }
    }


 


### **在轮转后的有序数组上应用二分查找法**


     之前我们说过二分法是要应用在有序的数组上,如果是无序的,那么比较和二分就没有意义了。


     不过还有一种特殊的数组上也同样可以应用,那就是“轮转后的有序数组(Rotated Sorted Array)”。它是有序数组,取其中某一个数为轴,将其之前的所有数都轮转到数组的末尾所得。比如{7, 11, 13, 17, 2, 3, 5}就是一个轮转后的有序数组。非严格意义上讲,有序数组也属于轮转后的有序数组——我们取首元素作为轴进行轮转。


     下边就是二分查找法在轮转后的有序数组上的实现(假设数组中不存在相同的元素)


 



/**

  • 在轮转后的有序数组上应用二分查找法

  • @param array

  • @param low

  • @param high

  • @param target

  • @return
    */
    int searchInRotatedSortedArray(int array[], int low, int high, int target)
    {
    while(low <= high)
    {
    int mid = (low + high) / 2;
    if (target < array[mid])
    if (array[mid] < array[high]) // the higher part is sorted
    high = mid - 1; // the target would only be in lower part
    else // the lower part is sorted
    if(target < array[low]) // the target is less than all elements in low part
    low = mid + 1;
    else
    high = mid - 1;

     else if(array[mid] < target)
         if (array[low] < array[mid])	// the lower part is sorted
             low = mid + 1;	// the target would only be in higher part
         else 	// the higher part is sorted
            if (array[high] < target)   // the target is larger than all elements in higher part
                 high = mid - 1;
             else
                 low = mid + 1;
     else 	// if(array[mid] == target)
         return mid;
    

    }
    return -1;
    }


 


     对比普通的二分查找法,为了确定目标数会落在二分后的哪个部分,我们需要更多的判定条件。但是我们还是实现了O(log n)的目标。


### **二分查找法的缺陷**


     二分查找法的O(log n)让它成为十分高效的算法。不过它的缺陷却也是那么明显的。就在它的限定之上:


     必须有序,我们很难保证我们的数组都是有序的。当然可以在构建数组的时候进行排序,可是又落到了第二个瓶颈上:它必须是数组。




### 前端框架

前端框架太多了,真的学不动了,别慌,其实对于前端的三大马车,Angular、React、Vue 只要把其中一种框架学明白,底层原理实现,其他两个学起来不会很吃力,这也取决于你以后就职的公司要求你会哪一个框架了,当然,会的越多越好,但是往往每个人的时间是有限的,对于自学的学生,或者即将面试找工作的人,当然要选择一门框架深挖原理。



以 Vue 为例,我整理了如下的面试题。

![Vue部分截图](https://img-blog.csdnimg.cn/img_convert/c6738a80c94640db83f7ffbf487ac5f0.png)

**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/topics/618166371)**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值