数字在排序数组中出现的次数
来源:互联网 发布:nba新秀排行榜2017数据 编辑:程序博客网 时间:2024/06/12 00:26
题目描述
统计一个数字在排序数组中出现的次数。
http://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
看到题目首先想到的时,使用二分找到这个数,然后在向上、向下查找,统计出这个数一共出现了几次。可是这个题目真的就这么简单吗?看了书上的解答之后,才发现自己大错特错。。。
由于需要查找的数字在长度为n的数组中出现的次数可能是O(n)次,所以在向上、向下扫描时的时间复杂度为O(n)。显然这种方法和之前从头扫描的时间复杂度没有区别。如果能够找到第一个k和最后一个k,就可以得到k出现的次数。普通二分找一个数找到的标志是找到的数array[mid]等于key值,为了找到第一个k,只需要再判断array[mid-1]是否等于k,若等于k,则说明第一个k在mid的前面。同理也可用二分找到最后一个k。这样时间复杂度就是O(logN)。
public int getNumberOfK(int[] array, int k) { int number = -1; if (array.length > 0) { int first = getFirstK(array, k, 0, array.length - 1); int last = getLastK(array, k, 0, array.length - 1); if (first > -1 && last > -1) number = last - first + 1; } return number; } public int getFirstK(int[] array, int k, int start, int end) { if (start > end) return -1; int mid = (start + end) / 2; if (array[mid] == k) { if ((mid > 0 && array[mid - 1] != k) || mid == 0) return mid; else end = mid - 1; } else if (array[mid] > k) end = mid - 1; else start = mid + 1; return getFirstK(array, k, start, end); } public int getLastK(int[] array, int k, int start, int end) { if (start > end) return -1; int mid = (start + end) / 2; int length = array.length; if (array[mid] == k) { if ((mid < length - 1 && array[mid + 1] != k) || mid == length - 1) return mid; else start = mid + 1; } else if (array[mid] < k) start = mid + 1; else end = mid - 1; return getLastK(array, k, start, end); }
0 0
- 【数组8】数字在排序数组中出现的次数
- 【数组4】数字在排序数组中出现的次数
- 数组9:数字在排序数组中出现的次数
- 数字在排序数组中出现的次数(数组)
- 在排序数组中,找出给定数字的出现次数
- 在排序数组中,找出给定数字的出现次数
- 在排序数组中,找出给定数字的出现次数
- 统计一个数字在排序数组中出现的次数
- 数字在排序数组中出现的次数
- 数字在排序数组中出现的次数
- 在排序数组中,找出给定数字的出现次数
- 在排序数组中,找出给定数字出现的次数
- 数字在排序数组中出现的次数
- 数字在排序数组中出现的次数
- 数字在排序数组中出现的次数
- 数字在排序数组中出现的次数
- 数字在排序数组中出现的次数
- 在排序数组中,找出给定数字的出现次数
- 115. Distinct Subsequences
- Jenkins进阶系列之——11修改Jenkins用户的密码
- [Spring实战系列](7)Spring注入方式之构造器注入
- Jenkins进阶系列之——12详解Jenkins节点配置
- JAVA代理与反射学习笔记(一)
- 数字在排序数组中出现的次数
- 备忘ClassNotFoundException: javax.interceptor.InvocationContext
- 备忘找不到com.sun.xml.internal.messaging.saaj.util包
- 备忘Document root element "beans",must match DOCTYPE root "null"
- 备忘启动jetty后log中不断交替出现Connector vm://localhost Started/Stopped
- 用listener和beanfactoryaware实现bean的动态装载
- Jenkins进阶系列之——13修改Jenkins权限控制
- 大数据挖掘-中国知网 papers
- ThreadPoolExecutor和CyclicBarrier配合使用可能带来的隐患