JZ37:数字在升序数组中出现的次数
数字在升序数组中出现的次数
http://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2
方法1:遍历,时间复杂度为O(n);
public static int GetNumberOfK1(int [] array , int k){ if(array.length==0){ return 0; } int count=0; for(int i=0;i<array.length;i++){ if(array[i]==k){ count++; } } return count; }
方法2:利用二分查找,可以查找k-0.5和k+0.5的下标,做差。就是k在数组中出现的次数
public static int GetNumberOfK2(int[] array,int k){ return binSearch(array,k+0.5)-binSearch(array,k-0.5); } public static int binSearch(int[] array,double k){ int start=0; int end=array.length-1; while(start<=end){ int mid=start+((end-start)>>1); if(k<array[mid]){ end=mid-1; } else{ start=mid+1; } } return start; }
方法3:二分查找,用递归二分法找到第一个k和最后一个k,然后得到个数
public static int GetNumberOfK3(int[] array,int k){ int num=0; if(array.length==0){ return 0; } int firstK=getFirstK(array,k,0,array.length-1); int lastK=getLastK(array,k,0,array.length-1); if(firstK>=0 && lastK>=0){ num=lastK-firstK+1; } return num; } //找到第一个出现的数字的下标 public static int getFirstK(int[] array,int k,int start,int end){ while (start <= end) { int mid = start + ((end - start) >> 1); if (k <= array[mid]) end = mid - 1; else start = mid + 1; } if (start < array.length && array[start] == k) return start; else return -1; } //找到最后一个出现的数字的下标 public static int getLastK(int[] array,int k,int start,int end){ while(start<=end){ int mid=start+((end-start)>>1); if(k>=array[mid]){ start=mid+1; } else{ end=mid-1; } } if(end>=0 && array[end]==k){ return end; } else return -1; }
剑指Offer题解 文章被收录于专栏
剑指Offer-Java版本题解