剑指Offer:指定数字在排序数组中出现的次数
2018-02-25 16:26
344 查看
统计指定数字再排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在数组中出现了4次,输出4。
第一个3出现的位置我们可以这样确定:如果中间值前一个元素不是3,说明中间值就是第一个3;如果前一个元素依旧是3,说明第一个3还在之前,再次使用二分法。最后一个3出现的位置思路相同。
实现代码:
使用二分查找法
由于数组是排序的我们应该很容易想到使用二分法查找指定数字。第一次查找中间值为3,等于我们要查找的数字,其他数字3可能在中间值的两侧,我们要查找到第一个3出现的位置和最后一个3出现的位置。第一个3出现的位置我们可以这样确定:如果中间值前一个元素不是3,说明中间值就是第一个3;如果前一个元素依旧是3,说明第一个3还在之前,再次使用二分法。最后一个3出现的位置思路相同。
实现代码:
//获取第一个指定元素出现的位置 private static int GetFirstK(int[] arr, int k,int left,int right) { if(left>right){ return -1; } int mid = (left+right)/2; if(arr[mid]==k){ if(mid>0&&arr[mid-1]!=k||mid==0){ return mid; }else{ right = mid-1; } }else{ if(arr[mid]>k){ right = mid-1; }else{ left = mid+1; } } return GetFirstK(arr,k,left,right); }
//获取最后一个指定元素出现的位置 private static int GetLastK(int[] arr, int k, int left, int right) { if(left>right){ return -1; } int mid = (left+right)/2; if(arr[mid]==k){ if(mid<arr.length-1&&arr[mid+1]!=k||mid==arr.length-1){ return mid; }else{ left = mid+1; } }else{ if(arr[mid]>k){ right = mid-1; }else{ left = mid+1; } } return GetLastK(arr,k,left,right); }
//整合 private static int GetCountsOfNum(int[] arr, int k) { if(arr==null||arr.length==0){ return -1; } int first = GetFirstK(arr,k,0,arr.length-1); int last = GetLastK(arr,k,0,arr.length-1); if(first>-1&&last>-1){ return last-first+1; } return 0; }
相关文章推荐
- 剑指offer——数字在排序数组中出现的次数
- 剑指offer--(5)数字在排序数组中出现的次数--Java描述
- 剑指offer(34)-数字在排序数组中出现的次数
- 剑指offer 数字在排序数组中出现的次数
- 剑指offer 数字在排序数组中出现的次数
- 《剑指offer》——数字在排序数组中出现的次数
- c++之数组篇1:对排序数组找出指定数字出现的次数
- 剑指offer系列之36:数字在排序数组中出现的次数
- 剑指offer系列源码-数字在排序数组中出现的次数
- 剑指Offer(第二版)面试题53:在排序数组中查找数字出现的次数
- 剑指offer-面试题38:数字在排序数组中出现的次数
- 剑指offer-面试题38-数字在排序数组中出现的次数
- 数字在排序数组中出现的次数(剑指offer)利用快排思想(O(logn))
- (剑指Offer)面试题38:数字在排序数组中出现的次数
- 【剑指offer系列】 数字在排序数组中出现的次数___38
- 《剑指offer》——数字在排序数组中出现的次数
- 《剑指offer》- 统计一个数字在排序数组中出现的次数
- 《剑指offer》数字在排序数组中出现的次数
- 剑指offer-数字在排序数组中出现的次数
- 剑指Offer(Java版):数字在排序数组中出现的次数