剑指offer——数字在排序数组中出现的次数
统计一个数字在排序数组中出现的次数。
自己用循环法写的:感觉这个方法很绕
看到排序数组,自然用二分法查找
public class Solution { public int GetNumberOfK(int [] array , int k) { if(array.length == 0) return 0; int count = 0; int low = 0, high = array.length - 1; while(high >= low){ int mid = (high - low)/2 + low; if(array[mid] > k){ high = mid - 1; } else if(array[mid] < k){ low = mid + 1; } else{ for(int i = mid; i <= high; i++){ if(array[i] == k){ count++; } } for(int i = mid - 1; i >= low; i--){ if(array[i] == k){ count++; } } break; } } return count; } }
其他人的方法:
找到k的第一次出现,最后一次出现就可以
public class Solution { public int GetNumberOfK(int [] array , int k) { int firstK = firstOfK(array, k); int lastK = lastOfK(array, k); return lastK - firstK + 1; } public int firstOfK(int [] array, int k){ int low = 0; int high = array.length - 1; while(high >= low){ int mid = (high + low) >> 1; if(array[mid] < k){ low = mid + 1; }else{ high = mid - 1; } } return low; } public int lastOfK(int [] array, int k){ int low = 0; int high = array.length - 1; while(high >= low){ int mid = (high + low) >> 1; if(array[mid] <= k){ low = mid + 1; } else{ high = mid - 1; } } return high; } }
注意:在找的时候要看清楚是找第一次出现的位置还是最后一次出现的位置
第一次出现的位置时
while(high >= low){ int mid = (high + low) >> 1; if(array[mid] < k){ low = mid + 1; }else{ high = mid - 1; } }
这个当array[mid] >= k时,此时若array[mid] == k时,high = mid - 1; 在找到k之后继续向前找,最后就可找到第一次出现的