【递归、二分查找】数字在排序数组中出现的次数
2016-09-06 16:20
621 查看
统计一个数字在排序数组中出现的次数。
/** * 数字在排序数组中出现的次数 * * 思路:有序数组,使用二分查找,找到第一个和最后一个K出现的位置 * * @author Administrator * */ public class Solution { public int GetNumberOfK(int[] array, int k) { int count = 0; if (null != array && 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)) { count = last - first + 1; } } return count; } /** * 递归求解第一个k出现的位置 * * @param array * @param k * @param start * @param end * @return */ public int GetFirstK(int[] array, int k, int start, int end) { if (start > end) { return -1; } int mid = (start + end) / 2; int midData = array[mid]; if (midData == k) { if ((mid >= 1 && array[mid - 1] != k) || mid == 0) { return mid; } else { end = mid - 1; } } else if (midData > k) { end = mid - 1; } else { start = mid + 1; } return GetFirstK(array, k, start, end); } /** * 递归求解最后一个k出现的位置 * * @param array * @param k * @param start * @param end * @return */ public int GetLastK(int[] array, int k, int start, int end) { if (start > end) { return -1; } int mid = (start + end) / 2; int midData = array[mid]; if (midData == k) { if ((mid + 1 < array.length && array[mid + 1] != k) || mid == array.length - 1) { return mid; } else { start = mid + 1; } } else if (midData > k) { end = mid - 1; } else { start = mid + 1; } return GetLastK(array, k, start, end); } }
相关文章推荐
- python gui 之 tkinter库
- Linux kernel Low Level debug
- tomcat7+jdk的keytool生成证书 配置https
- Java程序员的10个日志技巧
- ios上取得设备唯一标志的解决方案
- zabbix--从入门到精通之zabbix历史数据
- Java Service Wrapper简介与使用 linux
- 单Activity多Fragment模式快速构建一个App
- 全球历次房地产大泡沫如何破裂,看中国未来房价走势
- PsychoPy入门_05_循环和随机
- oracle系统包--dbms_output的用法
- JTA 深度历险 - 原理与实现
- 存储过程
- Mac安装Boost C++库
- Hi3516A开发--根文件系统
- C++单例模式与单例类模板
- Python基础-条件语句
- js 内置对象--String常用属性
- java zip压缩和解压
- 理解Java和Android原生注解