二分查找的特性及应用
如果我们熟悉二分查找,我们就知道二分查找有一个重要的基础,就是需要有序的顺序表。这里有两点,一个是有序,另一个是顺序表。一般来说,只要是查找的题目,和这两者挂上钩,基本就是二分查找无疑了。因为二分查找过于重要,建议大家自己要能写出代码。
题目描述
统计一个数字在一个排序数组中出现的次数。
题目分析
如果说从前往后扫描一个数组,统计这个数字在数组中出现的次数,显然复杂度是 O ( n ) O(n) O(n)的,完全用不到排序数组这个特点。我们要想用上这个特点,在一个排序数组中一个数字出现多次的话,显然这写数字是挤在一处的,我们只需要找到第一次出现的位置,然后找到最后一次出现的位置,显然就可以轻松得到这个数字出现的次数。那就是在有序数组中找第一次出现的位置和最后一次出现的位置。不用说了,必然二分查找。
但是我们知道普通的二分查找是找一个数字出现的位置,如果这个数字出现多次,二分查找只能返回其中一个的位置。而这个时候,我们就需要对代码进行修改,修改为可以保证只查找到该数的第一个数字或者最后一个数字。这个时候就完成了任务。但是这样可能就要写两个函数,一个找第一次出现的位置,一个找最后一次出现的位置。
我们可以对这个问题稍微做一做变通,我们在学习有序表的插入时候,可以通过二分查找找到插入的位置,我们也可以对代码进行修改,保证相同的数插入在最后面或者最前面。我们以插在最前面为例。插在最前面的位置显然就是这个数的起始位置(如果存在),我们可以通过这个函数来转换一下找到这个数的最后位置。如果我们的数组是整数类型,那么显然这个数加1的