Ider 发表于 2012-12-30 16:26:46

二分查找法的实现和应用(进阶篇)

<div id="cnblogs_post_body">在《二分查找法的实现和应用汇总》中,我介绍了二分查找法的基本应用,不过在面试的准备过程中,我还碰到了更多对于二分查找法的更进一步的使用。其实在《二分查找法的实现和应用汇总》的最后,我已经介绍了一个非常规的使用,也就是基于“轮转后的有序数组(Rotated Sorted Array)”检查某一个数是否存在。

找到轮转后的有序数组中第K小的数

对于普通的有序数组来说,这个问题是非常简单的,因为数组中的第K-1个数(即A)就是所要找的数,时间复杂度是O(1)常量。但是对于轮转后的有序数组,在不知道轮转的偏移位置,我们就没有办法快速定位第K个数了。
不过我们还是可以通过二分查找法,在log(n)的时间内找到最小数的在数组中的位置,然后通过偏移来快速定位任意第K个数。当然此处还是假设数组中没有相同的数,原排列顺序是递增排列。
在轮转后的有序数组中查找最小数的算法如下:
<div class="cnblogs_code">//return the index of the min value in the Rotated Sorted Array, whose range is int findIndexOfMinVaule(int A[], int low, int high){    if (low > high) return -1;    while (low < high) {      int mid = (low + high)/2;      if (A > A)            low = mid +1;      else            high = mid;    }      //at this point, low is equal to high    return low;}
页: [1]
查看完整版本: 二分查找法的实现和应用(进阶篇)