您的位置:首页 > 其它

【递归、二分查找】数字在排序数组中出现的次数

2016-09-06 16:20 621 查看
统计一个数字在排序数组中出现的次数。

/**
* 数字在排序数组中出现的次数
*
* 思路:有序数组,使用二分查找,找到第一个和最后一个K出现的位置
*
* @author Administrator
*
*/
public class Solution {
public int GetNumberOfK(int[] array, int k) {

int count = 0;

if (null != array && array.length > 0) {

int first = GetFirstK(array, k, 0, array.length - 1);
int last = GetLastK(array, k, 0, array.length - 1);

if ((first > -1) && (last > -1)) {
count = last - first + 1;
}
}

return count;
}

/**
* 递归求解第一个k出现的位置
*
* @param array
* @param k
* @param start
* @param end
* @return
*/
public int GetFirstK(int[] array, int k, int start, int end) {

if (start > end) {
return -1;
}

int mid = (start + end) / 2;
int midData = array[mid];

if (midData == k) {
if ((mid >= 1 && array[mid - 1] != k) || mid == 0) {
return mid;
} else {
end = mid - 1;
}
} else if (midData > k) {
end = mid - 1;
} else {
start = mid + 1;
}

return GetFirstK(array, k, start, end);
}

/**
* 递归求解最后一个k出现的位置
*
* @param array
* @param k
* @param start
* @param end
* @return
*/
public int GetLastK(int[] array, int k, int start, int end) {

if (start > end) {
return -1;
}

int mid = (start + end) / 2;
int midData = array[mid];

if (midData == k) {
if ((mid + 1 < array.length && array[mid + 1] != k) || mid == array.length - 1) {
return mid;
} else {
start = mid + 1;
}
} else if (midData > k) {
end = mid - 1;
} else {
start = mid + 1;
}

return GetLastK(array, k, start, end);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: