剑指offer系列41---数字在数组中出现的次数

时间:2021-09-05 11:07:10

【题目】统计一个数字在排序数组中出现的次数。

 1 package com.exe9.offer;
 2 
 3 /**
 4  * 【题目】统计一个数字在排序数组中出现的次数。
 5  * @author WGS
 6  *
 7  */
 8 public class GetNumOfK {
 9     public int getNumOfK(int[] arr,int target){
10         if(arr==null || arr.length<=0) return -1;
11         int len=arr.length;
12         int count=0;
13         
14         
15         int lastIndex=findLastK(arr, target, 0, len-1);
16         System.out.println("==="+lastIndex);
17         if(lastIndex==-1)
18             return -1;
19         int firstIndex=findFirstK(arr, target, 0, len-1);
20         System.out.println("==="+firstIndex);
21         
22         if(firstIndex>=0 && lastIndex>=0)
23             count=lastIndex-firstIndex+1;
24         
25         return count;
26         
27     }
28     
29     //先寻找重复数字出现在最左边的位置
30     public int findFirstK(int[] arr,int target,int start,int end){    
31         if(start>end) return -1;
32         
33         int midIndex=(start+end)/2;
34         int midVal=arr[midIndex];
35         
36         if(midVal==target){
37             while(midVal==target){
38                 midIndex--;
39                 midVal=arr[midIndex];
40             }
41             return midIndex+1;            
42         }else if(midVal<target){
43             start=midIndex+1;
44         }else{//midVal>target
45             end=midIndex-1;
46         }
47         
48         return findFirstK(arr,target,start,end);
49         
50     }
51     ////先寻找重复数字出现在最右边的位置
52     public int findLastK(int[] arr,int target,int start,int end){
53         if(start>end) return -1;
54         int midIndex=(start+end)/2;
55         int midVal=arr[midIndex];
56         
57         if(midVal==target){
58             while(midVal==target){
59                 midIndex++;    
60                 midVal=arr[midIndex];
61             }
62             return midIndex-1;            
63         }else if(midVal<target){
64             start=midIndex+1;
65         }else{//midVal>target
66             end=midIndex-1;
67         }
68         
69         return findFirstK(arr,target,start,end);    
70         
71     }
72 
73     public static void main(String[] args) {
74         int[] arr=new int[]{1};
75         GetNumOfK g=new GetNumOfK();
76         int num=g.getNumOfK(arr, 3);
77         System.out.println(num);
78 
79     }
80 
81 }