剑指offer-第六章面试中的各项能力(数字在排序数组中出现的次数)
2015-08-29 10:52
495 查看
题目:统计一个数字在排序数组中出现的次数。
思路:采用二分查找,找到该数字在数组中第一次出现的位置,然后再找到组后一个出现的位置。两者做减法运算再加1.时间复杂度为O(logn)
Java代码:
思路:采用二分查找,找到该数字在数组中第一次出现的位置,然后再找到组后一个出现的位置。两者做减法运算再加1.时间复杂度为O(logn)
Java代码:
//数字K在排序数组中出现的次数 //思路:用二分查找,找到第一个k和最后一个K public class NumberCount { public int numberCount(int[] a,int k){ if(a==null) return 0; int start=0; int end=a.length-1; int first=firstK(a,k,start,end); int last=endK(a,k,start,end); return last-first+1; } //通过二分查找,找到最后一个K private int endK(int[] a, int k, int start, int end) { if(a==null) return 0; int middle=(start+end)/2; if(a[middle]==k){ if(a[middle]==k&&a[middle+1]!=k||middle==a.length-1) return middle; else start=middle+1; } else if(a[middle]<k) start=middle+1; else end=middle-1; return endK(a,k,start,end); } //通过二分查找找到第一个K public int firstK(int[] a, int k, int start, int end) { if(a==null) return 0; int middle=(start+end)/2; if(a[middle]==k){ if(middle==0||a[middle-1]!=k&&a[middle]==k) return middle; else end=middle-1; } else if(a[middle]<k) start=middle+1; else end=middle-1; return firstK(a,k,start,end); } public static void main(String[] args) { int[] a={1,3,3,3,7,4,5}; NumberCount numberCount=new NumberCount(); int number=numberCount.numberCount(a, 3); System.out.println(number); } }
相关文章推荐
- 腾讯面试题
- 《剑指Offer》面试题:找到第一个只出现一次的字符
- 程序员面试金典1.5:实现字符串的压缩功能
- 《程序员思维训练》读书小记
- 面试题25.二叉树中和为某一值的路径
- 知识点总结: Java 面试宝典 2013版(超长版) - Java Web 部分
- 面试题24.二叉搜索树的后序遍历序列
- 黑马程序员_集合框架(三)
- 每天5道面试题(六)java基础
- 程序员的七年之痒(个人五年职业规划)
- 黑马程序员-----Java基础-----反射
- 为什么面试总喜欢考算法题?
- 黑马程序员——Java基础之IO流
- 黑马程序员——java基础 反射 (复习)
- 【LeetCode-面试算法经典-Java实现】【223-Rectangle Area(矩形区域)】
- 【LeetCode-面试算法经典-Java实现】【219-Contains Duplicate II(包含重复元素II)】
- 黑马程序员——Java基础---IO(二)
- 面试题:字符串查找
- 面试题:两个字符串是变位词
- 黑马程序员——多线程——多线程概述,实现,控制与安全问题的解决