码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-01-14 08:40:26      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:快速   有序   dex   定位   基于   find   时间   ase   顺序   

我们可以通过二分查找法,在log(n)的时间内找到最小数的在数组中的位置,然后通过偏移来快速定位任意第K个数。
此处假设数组中没有相同的数,原排列顺序是递增排列。
在轮转后的有序数组中查找最小数的算法如下:

int findIndexOfMin(int num[],int n) {
        int l = 0;
        int r = n-1;
        while(l <= r) {
            int mid = l + (r - l) / 2;
            if (num[mid] > num[r]) {
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        return l;
    }

接着基于此结果进行偏移,再基于数组长度对偏移后的值取模,就可以找到第K个数在数组中的位置了:

int findKthElement(int num[], int m, int k)
{
    if (k > m) return -1;
    int base = findIndexOfMin(num, 0, m-1);
    int index = (base+k-1) % m;
    return index;
}

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

标签:快速   有序   dex   定位   基于   find   时间   ase   顺序   

原文地址:http://www.cnblogs.com/energy1010/p/6284604.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!