统计一个数字在排序数组中出现的次数。
/*
* 受不了。。。。。。
*/
public class Solution {
public int GetNumberOfK(int [] array , int k) {
int count=0;
for(int i=0;i<array.length;i++){
if(array[i]==k)
count++;
}
return count;
}
}
不用递归会死的。
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
48
49
|
public
int
GetNumberOfK( int
[] array , int
k) { if
(array == null
|| array.length == 0 ) return
0 ; int
l = 0 ,
h = array.length - 1 ,
m1 = 0 ,
m2 = 0 ; if
(l == h) if
(array[ 0 ]
!= k) return
0 ; else return
1 ; while
(l < h) { int
mid = (l + h) / 2 ; if
(array[mid] < k) { if
(array[mid + 1 ]
== k) { m1
= mid; break ; } l
= mid + 1 ; } else
{ h
= mid; m1
= - 1 ; } } if
(array[m1+ 1 ]
!= k) //
can't find it. return
0 ; l
= 0 ; h
= array.length - 1 ; while
(l < h) { int
mid = (l + h) / 2 ; if
(array[mid] <= k) { m2
= mid; if
(array[mid + 1 ]
> k) break ; else
{ if
(mid + 1
>= h) { m2++; break ; } l
= mid + 1 ; } } else h
= mid; } return
m2 - m1; } |
用递归:
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
|
public
int
GetNumberOfK( int []
array, int
k) { if
(array == null
|| array.length == 0 ) return
0 ; int
t = getFirst(array, 0 ,
array.length - 1 ,
k); if
(t != - 1 ) return
getLast(array, 0 ,
array.length - 1 ,
k) - t + 1 ; return
0 ; } int
getFirst( int []
array, int
s, int
e, int
k) { if
(s >= e) return
array[s] == k ? s : - 1 ; int
m = (s + e) / 2 ; if
(array[m] < k) return
getFirst(array, m + 1 ,
e, k); else return
getFirst(array, s, m, k); } int
getLast( int []
array, int
s, int
e, int
k) { if
(s >= e) { if
(array[s] == k) return
s; return
array[s - 1 ]
== k ? s - 1
: - 1 ; } int
m = (s + e) / 2 ; if
(array[m] <= k) return
getLast(array, m + 1 ,
e, k); else return
getLast(array, s, m, k); } |