二分查找的实际应用

Posted 袁厨的算法小屋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找的实际应用相关的知识,希望对你有一定的参考价值。

35.搜索插入位置

题目描述

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
 
   
   
 
输入: [1,3,5,6], 5
输出: 2
示例 2:
 
   
   
 
输入: [1,3,5,6], 2
输出: 1
示例 3:
 
   
   
 
输入: [1,3,5,6], 7
输出: 4
示例 4:
 
   
   
 
输入: [1,3,5,6], 0
输出: 0

暴力解法

做题思路:

这个题目虽然是简单题目,但是通过率并不高,这是为什么呢?应该是边界情况思考不清楚,做这个题目给我的第一想法就是利用二分查找来做。这样的效率会相对高一些。
插入情况无非就这几种
(1)比数组里的任何值都小,插入头部
(2)比数组里的任何值都大,插入尾部
(3)查询到数组元素,返回该处索引值
(4)数组内无该元素,将其插入两元素之间。

题目代码:

class Solution {
    public int searchInsert(int[] nums, int target) {
          //数组为0的情况
          if(nums.length == 0){
              return 0;
          }
          //第一种情况
          if(target<=nums[0]){
              return 0;
          }
          //第二种情况
          if(target>nums[nums.length-1]){
              return nums.length;
          }
          for(int i = 1;i<nums.length;i++){
              //第三种情况
              if(nums[i]==target){
                  return i;
              }
              //第四种情况
              if(target>nums[i-1]&&target<nums[i]){
                  return i;
              }
          }
        return 0;
    }
}

二分查找法

做题思路:

二分查找主要针对有序数组,根本原来相当于双指针,一个指针指示最大值,一个指针指示最小值。下面我们通过一个例子进行说明我们想查找的数字为48上面的这个例子为一个有序数组,红色为low绿色为hig,蓝色为mid。我们首先求出low和hig的中间位置的数和我们想要查找的数进行比较,然后我们知道是高了还是低了。如果中间数大于被查找的数,那么我们就hig指针到mid的前一位。如果小于被查找的数我们就以移动low指针到mid指针的后一位。该例子的中心思想就好比。平常我们让朋友猜价格,当朋友猜错的时候我们会给他提示,是猜高了还是低了,进而一步步的缩小范围。直至猜中

题目代码:

class Solution {
    public int searchInsert(int[] nums, int target) {
       int left = 0, right = nums.length - 1;
       while(left <= right) {
            //中间值,与target对比
           int mid = (left + right) / 2;
           if(nums[mid] == target) {
               return mid;
           } else if(nums[mid] < target) {
               left = mid + 1;
           } else {
                right = mid - 1;
           }
        }
        return left;
    }
}

总结

以上就是这个题目的两种做法,肯定还有别的做法,代码也可以进行简写。这是呈现的是最容易让人理清逻辑的代码,希望大家通过这个题目可以理解二分查找,掌握二分查找的使用方法。

C++版本的大家可以看一下这个文章,写的很细致。还有一些其他文章。作者人也很nice。

大家还可以关注我的CSDN:https://blog.csdn.net/tan45du_yuan/每天都会为大家更新一道精选算法题。感谢大家支持。

题目来源:

- END -


以上是关于二分查找的实际应用的主要内容,如果未能解决你的问题,请参考以下文章

二分查找的高阶应用实战

二分查找在RocketMQ和Kafka中的应用

二分查找在RocketMQ和Kafka中的应用

简单实用算法——二分查找法(BinarySearch)

PHP算法之二分查找

二分查找法二分排序法,返回最接近的位置和实际位置