【题目】统计一个数字在排序数组中出现的次数。
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 }