题目链接:统计一个数字在排序数组中出现的次数。
解题思路:
由于数组有序,所以使用二分查找方法定位k的第一次出现位置和最后一次出现位置
这里有一个大坑:&&这个符号非常坑爹,&&的短路功能,当第一个表达式的值为false的时候,则不再计算第二个表达式;所以总是提示数组越界就是在这里!!!!。
1 public class Solution { 2 public int GetNumberOfK(int [] array , int k) { 3 int first = getFirstK(array,k); 4 int end = getLastK(array,k); 5 int num = 0; 6 if(first > -1 && end > -1){ 7 num = end - first + 1; 8 return num; 9 } 10 return num; 11 } 12 13 public int getFirstK(int[] array,int k){ 14 int start = 0; 15 int end = array.length-1; 16 while(start<=end){ 17 int mid=(start+end)/2; 18 if(k<array[mid]) 19 end=mid-1; 20 else if(k>array[mid]) 21 start=mid+1; 22 else{ 23 if((mid>0&&array[mid-1]!=k)||mid==0) 24 return mid; 25 else{ 26 end=mid-1; 27 } 28 } 29 } 30 return -1; 31 } 32 33 public int getLastK(int[] array,int k){ 34 int start = 0; 35 int end = array.length-1; 36 while(start<=end){ 37 int mid=(start+end)/2; 38 if(k<array[mid]) 39 end=mid-1; 40 else if(k>array[mid]) 41 start=mid+1; 42 else{ 43 if((mid<array.length-1&&array[mid+1]!=k)||mid==array.length-1) 44 return mid; 45 else{ 46 start=mid+1; 47 } 48 } 49 } 50 return -1; 51 } 52 53 }