题目:

统计一个数字在排序数组中出现的次数。

分析:

给定一个已经排好序的数组,统计一个数字在数组中出现的次数。

那么最先想到的可以遍历数组统计出现的次数,不过题目给了排序数组,那么一定是利用了排序这个性质来缩减时间复杂度的。

因为如果所给的数字在数组中出现,那么这个数字在数组中一定是连续的,那么可以利用二分查找所给出的数字的首尾索引。

程序:

C++

class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
if(data.size() == ){
return ;
}
int l = FindFirst(data, k, , data.size()-);
int r = FindEnd(data, k, , data.size()-);
if(r != - && l != -)
return r-l+;
else
return ;
}
int FindFirst(vector<int> &data ,int k, int left, int right){
if(left > right)
return -;
int mid = left + (right - left) / ;
if(data[mid] == k){
if((mid > && data[mid-] != k) || mid == )
return mid;
else
right = mid - ;
}
else if(data[mid] < k){
left = mid + ;
}
else{
right = mid -;
}
return FindFirst(data, k, left, right);
}
int FindEnd(vector<int> &data ,int k, int left, int right){
if(left > right)
return -;
int mid = left + (right - left) / ;
if(data[mid] == k){
if((mid < data.size()- && data[mid+] != k) || mid == data.size()-)
return mid;
else
left = mid + ;
}
else if(data[mid] < k){
left = mid + ;
}
else{
right = mid -;
}
return FindEnd(data, k, left, right);
}
};

Java

public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array.length == 0){
return 0;
}
int l = FindFirst(array, k, 0, array.length-1);
int r = FindEnd(array, k, 0, array.length-1);
if(r != -1 && l != -1)
return r-l+1;
else
return 0;
}
int FindFirst(int [] array ,int k, int left, int right){
if(left > right)
return -1;
int mid = left + (right - left) / 2;
if(array[mid] == k){
if((mid > 0 && array[mid-1] != k) || mid == 0)
return mid;
else
right = mid - 1;
}
else if(array[mid] < k){
left = mid + 1;
}
else{
right = mid -1;
}
return FindFirst(array, k, left, right);
}
int FindEnd(int [] array ,int k, int left, int right){
if(left > right)
return -1;
int mid = left + (right - left) / 2;
if(array[mid] == k){
if((mid < array.length-1 && array[mid+1] != k) || mid == array.length-1)
return mid;
else
left = mid + 1;
}
else if(array[mid] < k){
left = mid + 1;
}
else{
right = mid -1;
}
return FindEnd(array, k, left, right);
}
}

最新文章

  1. echarts引入及应用
  2. iOS阶段学习第二天笔记(数据类型与进制)
  3. zepto的tap事件的穿透分析
  4. Mina小例子
  5. GCD的使用和面试题集锦
  6. Kafka 0.10 KafkaConsumer流程简述
  7. 高性能JavaScript(1)
  8. 乐乐课堂_leleketang.com
  9. EF6学习笔记(四) 弹性连接及命令拦截调试
  10. Python操作Influxdb数据库
  11. javaWEB登录ajax传值
  12. 【题解】 bzoj4033: [HAOI2015]树上染色* (动态规划)
  13. nginx 跨域配置
  14. C/C++服务器开发的必备利器–libconfig
  15. mysql 数据操作 单表查询 通过四则运算查询
  16. python学习笔记(十七)网络编程之urllib模块
  17. spark SQL学习(数据源之json)
  18. [Maven实战-许晓斌]-[第二章]-2.6 NetBeans上面安装Maven插件
  19. 【shiro】关于shiro匹配URL的小用法
  20. 教你用webgl快速创建一个小世界

热门文章

  1. Flask 教程 第十二章:日期和时间
  2. Mac Electron 应用的签名(signature)和公证(notarization)
  3. mysql创建用户后无法进入
  4. 推荐一个好用的行内可编辑的table组件 vxe-table
  5. linux 执行 javac 报错 javac: command not found
  6. spring boot 2.2.0开始freemarker模板默认扩展名改为ftlh了
  7. JavaScript-----8.数组
  8. HashMap、HashTable 和 ConcurrentHashMap 线程安全问题
  9. ReactNative: 使用导航栏组件-NavigatorIOS组件和Navigator组件
  10. thinkphp5.0学习笔记