/**
* 统计一个数字在排序数组中出现的次数。 数组是排序的,只需要找到第一个K和最后一个K就可以知道有多少个,
* 如果直接遍历,时间复杂度是o(n),用二分查找,时间复杂度是o(logn)
*
* @author pomay
*
*/
public class GetNumberOfK
{
public static int findFirstK(int[] a, int k, int start, int end)// 找到第一个k
{
if (start > end)
return -1;
int mid = (start + end) / 2;
if (k == a[mid])
{
if (mid > 0 && a[mid - 1] != k || mid == 0)// 如果找到这个k,前面没有k,就是第一个k
return mid;
else
end = mid - 1;
} else if (k > a[mid])
start = mid + 1;
else
end = mid - 1;
return findFirstK(a, k, start, end);
}
public static int findLastK(int[] a, int k, int start, int end)// 找到最后一个k
{
if (start > end)
return -1;
int mid = (start + end) / 2;
if (k == a[mid])
{
if (mid < a.length - 1 && a[mid + 1] != k || mid == a.length - 1)// 如果找到这个k,后面没有k,就是最后一个k
return mid;
else
start = mid + 1;
} else if (k > a[mid])
start = mid + 1;
else
end = mid - 1;
return findLastK(a, k, start, end);
}
public static int GetNumberOfK(int[] array, int k)
{
int num = 0;
if (array != null && array.length > 0)
{
int firstK = findFirstK(array, k, 0, array.length - 1);
int lastK = findLastK(array, k, 0, array.length - 1);
// System.out.println("firstK=" + firstK + ",lastK=" + lastK);
if (firstK > -1 & lastK > -1)
num = lastK - firstK + 1;
}
return num;
}
public static void main(String[] args)
{
int[] a =
{ 1, 2, 3, 3, 3, 3, 4, 5 };
int k = 3;
System.out.println(GetNumberOfK(a, k));
}
}
统计一个数字在排序数组中出现的次数。 数组是排序的,只需要找到第一个K和最后一个K就可以知道有多少个,
最新推荐文章于 2021-05-10 19:33:02 发布