题目描述:统计一个数字在排序数组中出现的次数。
思路:由于数组有序,所以使用二分查找方法定位k的第一次出现位置和最后一次出现位置。
递归写法:
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if (array.length == 0) return 0;
int firstK = getFirstK(array, k, 0, array.length - 1);
int lastK = getLastK(array, k, 0, array.length - 1);
if (firstK != -1 && lastK != -1)
return lastK - firstK + 1;
return 0;
}
private int getFirstK(int[] arr, int k, int start, int end)
{
if (start > end) return -1;
int mid = (start + end) >> 1;
if (arr[mid] > k)
return getFirstK(arr, k, start, mid - 1);
else if (arr[mid] < k)
return getFirstK(arr, k,mid + 1, end);
else
{
if (mid - 1 >= start && arr[mid - 1] == k)
return getFirstK(arr, k, start, mid - 1);
else return mid;
}
}
private int getLastK(int[] arr, int k, int start, int end)
{
if (start > end) return -1;
int mid = (start + end) >> 1;
if (arr[mid] > k)
return getLastK(arr, k, start, mid - 1);
else if (arr[mid] < k)
return getLastK(arr, k,mid + 1, end);
else
{
if (mid + 1 <= end && arr[mid + 1] == k)
return getLastK(arr, k, mid + 1, end);
else return mid;
}
}
}
非递归写法:
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if (array.length == 0) return 0;
int firstK = getFirstK(array, k, 0, array.length - 1);
int lastK = getLastK(array, k, 0, array.length - 1);
if (firstK != -1 && lastK != -1)
return lastK - firstK + 1;
return 0;
}
private int getFirstK(int[] arr, int k, int start, int end)
{
while (start <= end)
{
int mid = (start + end) >> 1;
if (arr[mid] < k) start = mid + 1;
else if (arr[mid] > k) end = mid - 1;
else
{
if (mid - 1 >= start && arr[mid - 1] == k) end = mid - 1;
else return mid;
}
}
return -1;
}
private int getLastK(int[] arr, int k, int start, int end)
{
while (start <= end)
{
int mid = (start + end) >> 1;
if (arr[mid] < k) start = mid + 1;
else if (arr[mid] > k) end = mid - 1;
else
{
if (mid + 1 <= end && arr[mid + 1] == k) start = mid + 1;
else return mid;
}
}
return -1;
}
}