找轮转后的有序数组中第K小的数
Posted energy1010
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了找轮转后的有序数组中第K小的数相关的知识,希望对你有一定的参考价值。
我们可以通过二分查找法,在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小的数的主要内容,如果未能解决你的问题,请参考以下文章