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

本文共 2133 字,大约阅读时间需要 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; }};

转载地址:http://ccdix.baihongyu.com/

你可能感兴趣的文章
Spark:求出分组内的TopN
查看>>
Python爬取豆瓣《复仇者联盟3》评论并生成乖萌的格鲁特
查看>>
关于跨DB增量(增、改)同步两张表的数据小技巧
查看>>
飞秋无法显示局域网好友
查看>>
学员会诊之03:你那惨不忍睹的三层架构
查看>>
vue-04-组件
查看>>
Golang协程与通道整理
查看>>
解决win7远程桌面连接时发生身份验证错误的方法
查看>>
C/C++ 多线程机制
查看>>
js - object.assign 以及浅、深拷贝
查看>>
python mysql Connect Pool mysql连接池 (201
查看>>
Boost在vs2010下的配置
查看>>
一起谈.NET技术,ASP.NET伪静态的实现及伪静态的意义
查看>>
20款绝佳的HTML5应用程序示例
查看>>
string::c_str()、string::c_data()及string与char *的正确转换
查看>>
11G数据的hive初测试
查看>>
如何使用Core Text计算一段文本绘制在屏幕上之后的高度
查看>>
==和equals区别
查看>>
2010技术应用计划
查看>>
XML 节点类型
查看>>