剑指offer——面试题38:数字在排序数组中出现的次数

20180906整理

Solution1:

【注意】先利用二分查找扎到一个值然后再顺序遍历的做法时间复杂度也是O(n)O(n)O(n),代码也在下面进行展示。
复杂度为O(n)O(n)O(n)的破算法。

class Solution {
public:int GetNumberOfK(vector<int> data ,int k) {int n = data.size();if(n == 0)return 0;else {int count = 0;for(int i = 0; i < n; i++) {if(data[i] == k)count++;}return count;}}
};

二分查找+顺序遍历
时间复杂度O(n)O(n)O(n)

class Solution { //二分查找 + 遍历
public:int GetNumberOfK(vector<int> data, int k) {if (!data.size()) return 0;else if (data.size() == 1) {if (data[0] == k) return 1;else return 0;}int pos = binary_search(data, 0, data.size() - 1, k);if (pos == -1) return 0;int res = seq_search(data, pos);return res;}int binary_search(vector<int> &data, int start, int end, int k) {while (start <= end) {int mid = (start + end) >> 1;if (data[mid] == k)return mid;if (data[mid] < k)start = mid + 1;else end = mid - 1;}return -1;}int seq_search(vector<int> &data, int pos) {int i = pos - 1, j = pos + 1, res = 1;while (i >= 0 && data[i] == data[pos]) {i--;res++;}while (j < data.size() && data[j] == data[pos]) {j++;res++;}return res;}
};

Solution2:

复杂度为O(logn)O(logn)O(logn)的二分查找算法。。
还顺手复习了下二分查找,挺好的。。。
递归版二分查找如下:

class Solution {
public:int GetNumberOfK(vector<int> data ,int k) {int n = data.size();if(n == 0) return 0;else {int lastnum = GetLastOfK(data, k, 0, n - 1), firstnum = GetFirstOfK(data, k, 0, n - 1);if(firstnum > -1 && lastnum > -1)return lastnum - firstnum + 1;else return 0;}}int GetFirstOfK(vector<int> &data, int k, int begin, int end){if(begin > end)return -1;int middleindex = (begin + end) / 2;if(data[middleindex] == k) {if(middleindex > 0 && data[middleindex - 1] != k || middleindex == 0)return middleindex;else end = middleindex - 1;}else if(data[middleindex] < k) {begin = middleindex + 1;}else if(data[middleindex] > k) {end = middleindex - 1;}return GetFirstOfK(data, k, begin, end);}int GetLastOfK(vector<int> &data, int k, int begin, int end){if(begin > end)return -1;int middleindex = (begin + end) / 2;if(data[middleindex] == k) {if(middleindex < data.size() - 1 && data[middleindex + 1] != k || middleindex == data.size() - 1)return middleindex;else begin = middleindex + 1;}else if(data[middleindex] < k) {begin = middleindex + 1;}else if(data[middleindex] > k) {end = middleindex - 1;}return GetLastOfK(data, k, begin, end);}
};

Solution3:

迭代版二分查找完整代码
参考网址:https://www.nowcoder.com/profile/7221411/codeBookDetail?submissionId=14533282

class Solution {
public:int GetNumberOfK(vector<int> data ,int k) {int n = data.size();if (n == 0)return 0;else {int lastnum = getLastK(data, k, 0, n - 1), firstnum = getFirstK(data, k, 0, n - 1);if (firstnum > -1 && lastnum > -1)return lastnum - firstnum + 1;else return 0;}}int getFirstK(vector<int> &array, int k, int start, int end) {while (start <= end) {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 if (array[mid] < k) {start = mid + 1;}}return -1;}int getLastK(vector<int> &array, int k, int start, int end) {while (start <= end) {int mid = (start + end) >> 1;if (array[mid] == k) {if (mid < array.size() - 1 && array[mid + 1] != k || mid == array.size() - 1)return mid;else start = mid + 1;} else if (array[mid] > k) {end = mid - 1;} else if (array[mid] < k) {start = mid + 1;}}return -1;}
};

剑指offer——面试题38:数字在排序数组中出现的次数相关推荐

  1. 【剑指offer-Java版】38数字在排序数组中出现的次数

    数字在排序数组中出现的次数: 最简单粗暴的方法是O(n^2) 可能的解法可以采用二分,首先根据二分找到给定数字在数组中的位置,然后再左右二分,找到边界(第一个和最后一个),左右边界的差值就是出现次数 ...

  2. 剑指Offer - 面试题53 - I. 在排序数组中查找数字 I(二分查找的变形版本)

    1. 题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2示例 2: 输入: nums = [5,7,7,8, ...

  3. 剑指offer面试题53 - I. 在排序数组中查找数字 I(二分查找)

    题目描述 统计一个数字在排序数组中出现的次数. 思路 详见链接 代码 class Solution:def search(self,nums:[int],target:int)->int:i, ...

  4. 剑指offer——面试题3:二维数组中的查找

    剑指offer--面试题3:二维数组中的查找 1.笨蛋方法 复杂度为O(n2)O(n^2)O(n2) class Solution { public:bool Find(int target, vec ...

  5. 算法题001 剑指Offer 面试题三:二维数组中的查找

    剑指Offer题目1:二维数组中的查找 题目描述: http://ac.jobdu.com/problem.php?cid=1039&pid=0 在一个二维数组中,每一行都按照从左到右递增的顺 ...

  6. [剑指offer]面试题3:二维数组中的查找

    面试题3:二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  7. [剑指offer]面试题第[56-2]题[JAVA][数组中数字出现的次数][状态机][hashmap][位运算]

    [问题描述][中等] 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字.示例 1:输入:nums = [3,4,3,3] 输出:4 示例 2:输入:n ...

  8. 剑指Offer面试题:2.二维数组中的查找

    一 题目:二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的二维数组和一个整数判读数组中是否含有该整数. 二 ...

  9. C++版 - 剑指offer面试题38:数字在已排序数组中出现的次数

    数字在已排序数组中出现的次数 提交网址: http://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?tpId=13&t ...

最新文章

  1. 【青少年编程】【一级】 奔跑的马
  2. 更换XP SN的vbs
  3. TCP Fast Open知识
  4. 基于 FFmpeg 的播放器 demo
  5. 测序发展史:150年的风雨历程
  6. php获取虚拟机ip,php如何获取用户的ip地址
  7. 【渝粤题库】陕西师范大学201701 高等数学(二)作业 (高起本、专升本)
  8. 深入理解SpringCloud之Eureka注册过程分析
  9. Oracle 分析函数的使用(主要是rollup用法)
  10. cmake静态编译以及安装带有opencv的静态库并调用
  11. adb 启动app_app常见性能测试点之响应时间
  12. BZOJ2428[HAOI2006] 均分数据
  13. win10下安装adb
  14. ffmpeg 中av_rescale_rnd 与av_rescale ()(AVRounding结构体)
  15. 圆 最小外包矩形_基于迭代最小外包矩形的城区建筑物轮廓规则化方法
  16. 耐得寂寞,拥得繁华 (转)
  17. 创建博客园 博客阅读器(使用 JavaScript 和 HTML 的 Metro 风格应用)源码
  18. Vue在线预览ppt,可嵌入组件显示也可新开页面显示
  19. 微信公众号编辑菜单栏代码
  20. rd650服务器安装linux,联想RD650RAIDLinux6.6.pdf

热门文章

  1. 安卓中为什么onkeydown没有相应_为什么今年在园区注册个人独资企业能将企业总税率降低至3%?...
  2. linux编码合适修改_CentOS升级Linux内核备忘录
  3. win7专业版 .bat脚本运行_IT运维老司机:聊聊BAT批处理提升工作效率
  4. mysql中having的例子_有关mysql中having子句对组记录进行筛选的例子
  5. c语言定义函数后引用,求助,函数在其他函数中使用时要先声明后调用,这个没声明就用了...
  6. 3层b+树索引访问磁盘次数_深入理解MySQL索引底层实现原理丨技术干货
  7. 使用遗传算法解决图着色问题
  8. java 十亿数据去重_如何在有限的内存限制下实现数十亿级手机号码去重
  9. Java RandomAccessFile示例
  10. c语言三元运算符_了解C / C ++中的三元运算符