本文准备讲解1个简单的算法编程问题, 这个算法编程问题来自LintCode平台。不了解.LintCode平台的读者可以阅读笔者文章(在线编程平台推荐-LeetCode)。问题的英文版本描述如下:
First Position of Target
For a given sorted array (ascending order) and a target number, find the first index of this number in O(log n) time complexity.
If the target number does not exist in the array, return -1.
Example
If the array is [1, 2, 3, 3, 4, 5, 10], for given target 3, return 2.
问题的中文版本描述:
二分查找
给定一个排序的整数数组(升序)和一个要查找的整数 target,用O(logn)的时间查找到 target 第一次出现的下标(从0开始),如果 target 不存在于数组中,返回-1。
样例
在数组[1, 2, 3, 3, 4, 5, 10]中二分查找3,返回2。
刚好JAVA语言支持对数组的二分查找,所以这个问题很有价值。JAVA语言自带的数组二分查找函数无法支持数组中有重复数据的状况,当数组中有重复数据时,自带函数不保证返回的返回值为需要的目标数据数组下标号。比如对样例数组,查找3返回3;而不是题目需要的2。为了处理重复数据的问题,必须对经典二分查找算法做改造。关键的算法为:找到目标数据后,不能中断查找算法;继续寻找数组下标号最小的目标数据项。
算法的代码列表如下:
现在公布1种高效的算法方案,该方案对应 LintCode 平台表现更强。