博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(剑指Offer)面试题38:数字在排序数组中出现的次数
阅读量:5077 次
发布时间:2019-06-12

本文共 2210 字,大约阅读时间需要 7 分钟。

题目:

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

思路:

1、顺序遍历

顺序扫描一遍数组,统计该数字出现的次数。

时间复杂度:O(n)

2、二分查找

假设我们需要找的数字是k,那么就需要找到数组中的第一个k和最后一个k出现的位置。

如何通过二分查找得到第一个k的位置呢?

取数组中间的数字与k作比较,

如果该数字比k大,那么k只能出现在前半部分,那么下一轮只能在前半部分找;

如果该数字比k小,那么k只能出现在后半部分,那么下一轮只能在后半部分找;

如果该数字等于k,需要判断这是不是第一个k,如果该数字的前一个数字不是k,那么该数字就是第一个k,否则需要在前半部分继续寻找第一个k;

寻找最后一个k的方法与寻找第一个k的方法一样。

代码:

#include 
using namespace std;int getFirstK(int* data,int k,int start,int end){ while(start<=end){ int mid=start+((end-start)>>1); if(data[mid]==k){ if((mid>0 && data[mid-1]!=k) || mid==0) return mid; else end=mid-1; } else if(data[mid]>k) end=mid-1; else start=mid+1; } return -1;}int getLastK(int* data,int length,int k,int start,int end){ while(start<=end){ int mid=start+((end-start)>>1); if(data[mid]==k){ if((mid

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/70610bf967994b22bb1c26f9ae901fa2?rp=2

AC代码:

class Solution {public:    int GetNumberOfK(vector
data,int k) { int len=data.size(); if(len<=0) return 0; int first=getFirstK(data,k,0,len-1); int last=getLastK(data,len,k,0,len-1); if(first!=-1 && last!=-1) return last-first+1; return 0; } int getFirstK(const vector
&data,int k,int start,int end){ int mid; while(start<=end){ mid=start+((end-start)>>1); if(data[mid]==k){ if((mid>0 && data[mid-1]!=k) || mid==0) return mid; else end=mid-1; } else if(data[mid]>k) end=mid-1; else start=mid+1; } return -1; } int getLastK(const vector
&data,int length,int k,int start,int end){ int mid; while(start<=end){ mid=start+((end-start)>>1); if(data[mid]==k){ if((mid
k) end=mid-1; else start=mid+1; } return -1; }};

转载于:https://www.cnblogs.com/AndyJee/p/4678344.html

你可能感兴趣的文章
线程池
查看>>
mybatis plus 的代码生成器
查看>>
机房收费系统之重新设计
查看>>
PHP 简单 延时任务
查看>>
开始Flask项目(2017.11.3)
查看>>
.NET WinForm下一个支持更新ProgressBar进度的DataGridView导出数据到Excel的类
查看>>
路由器一些主要的设置内容(虚拟服务器)
查看>>
MyBatis执行insert如何返回主键
查看>>
linux -bash: ipconfig: command not found 解决方法
查看>>
针对CRM 多对多开发的的自定义页面在CRM 上调用
查看>>
matplotlib学习日记(十一)---坐标轴高阶应用
查看>>
调用外部程序主窗体做子窗体
查看>>
PHP功能模块扩展——ImageMagick
查看>>
web.xml中的listener,servlet,filter的启动顺序问题
查看>>
winform插件机制学习
查看>>
父窗口中获取iframe中的元素
查看>>
计网 | 网络体系结构的思考
查看>>
c++学生成绩管理系统
查看>>
Angular双向数据绑定
查看>>
几个好玩的在线编程网站
查看>>