leetcode题解-binary search题目总结

前面一段时间刷完了二叉搜索部分的题目,现在闲下来写一个总结贴,主要针对这部分题目类型以及所使用的方法。

有序数组查找目标值索引

首先来说最简单的binary-search,应用在有序数组查找target值等问题中,一般会有两种解法,也就是binary-search问题中最关键的边界问题和更新方案的区别,这里推荐大家选择一种自己喜欢的方案用就可以,不用同时记住两种,反而会搞混,比如我都是用第一种:

    public int searchInsert(int[] nums, int target) {
        //high取数组长度减1
        int low=0, high=nums.length-1, mid;
        //循环条件是low<=high
        while(low<=high){
            mid = (low+high)/2;
            //要有返回语句且high赋值为mid-1
            if(target == nums[mid])
                return mid;
            else if(target < nums[mid])
                high = mid-1;
            else
                low = mid+1;
        }
        return low;
    }

    public int searchInsert1(int[] nums, int target) {
        //high取数组长度
        int low = 0, high = nums.length, mid;
        //循环条件是low
        while(low < high) {
            mid = low + (high - low) / 2;
            //没有返回语句且high赋值为mid
            if(nums[mid] < target)
                low = mid + 1;
            else
                high = mid;
        }
        return low;
    }

其实要注意的就三个地方,high初始值,while循环条件以及high更新方案。自己选择一套方案即可。

在这个基础上,binary-search还有几种变形,比如说寻找第一个大于或者小于target的值的索引,其实主要还是要找到边界条件的判断和更新方案,这部分的分析我们可以参考下面这个链接:
关于二分查找的总结

找到binary-search应用的点

说白了binary-search是一种加速算法时间复杂度的方法,本身并没有什么难度,重要的是如何理解题目,找到运用binary-search的地方。比如我们之前说到的有两种binary search的思路,然后再加上一个:

  • 对数组的索引进行二插搜索,看相应位置的元素是否满足某种条件(基本用法)
  • 直接对数组所有元素的范围进行二叉搜索,然后检查数组中所有元素是否满足相应条件(需要自己进行设计检查方法,比如378. Kth Smallest Element in a Sorted Matrix这道题目等)
  • 把二叉搜索当做子函数作为一种判断依据使用,每次循环中都使用其返回一个结果作为下次循环的条件或者依据等

好多题目都忘了==又不想在重新刷一遍,所以这个总结写的有点水,不过也给自己提个醒吧,以后在刷题的时候整个文件来记录每道题的思路和点。这样方便最后进行总结和回顾,好了,就先写到这,以后慢慢在修改吧##

你可能感兴趣的:(leetcode刷题)