-
Notifications
You must be signed in to change notification settings - Fork 0
/
37.java
47 lines (45 loc) · 1.45 KB
/
37.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class Solution {
public int GetNumberOfK(int [] array , int k) {
//这道题目一看到是有序数组,第一反应应该是二分查找。主要思路就是先找到第一个k出现的下标,在找到最后一个k出现的下标,二者相减加1得到结果。
if(array==null || array.length<=0) return 0;
int n=array.length;
int left=findFirst(array,k,0,n-1);
int right=findLast(array,k,0,n-1);
if(left!=-1 && right!=-1)
return right-left+1;
return 0;
}
//找到第一次出现的位置
public int findFirst(int []array,int k, int start,int end)
{
if(start>end) return -1;
int mid=start+(end-start)/2;
if(array[mid]==k)
{
if(mid==start || array[mid-1]!=k)
return mid;
else end=mid-1;
}else if(array[mid]>k)
end=mid-1;
else
start=mid+1;
return findFirst(array,k,start,end);
}
//找到最后一次出现的位置
public int findLast(int []array,int k,int start,int end)
{
if(start>end)return -1;
int mid=start+(end-start)/2;
if(array[mid]==k)
{
if(mid==end || array[mid+1]!=k)
return mid;
else
start=mid+1;
}else if(array[mid]>k)
end=mid-1;
else
start=mid+1;
return findLast(array,k,start,end);
}
}