博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[折半查找]排序数组中某个元素出现次数
阅读量:6380 次
发布时间:2019-06-23

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

题目描述:

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

这个问题的初始解法就是,在排序的数组中利用折半查找,这个k之后,然后以这个为中心,分别向左右遍历,统计k出现的次数。

这种方法虽然利用了折半查抄,使得定位这个元素的时间复杂度为O(logn),但是在以这个元素为中心左右查找的时候,时间复杂度又降低为了O(n),所以总体的时间复杂度还是O(n)。

新的想法:分别利用两次折半查找,找到k的第一次出现的位置,然后再找到k最后一次出现的位置。这样就能直接的求出k的个数,而不用任何的遍历过程。

int GetNumberOfK(vector
data ,int k) { int first = 0; int last = data.size() - 1; int firstKIndex = GetFirstK(data, 0, last, k); if(firstKIndex == -1) return 0; int lastKIndex = GetLastK(data, 0, last, k); return lastKIndex - firstKIndex + 1;}int GetFirstK(vector
&arr, int first, int last, int k){ while(first <= last) { int mid = (first + last) / 2; if(arr[mid] > k) { last = mid - 1; } else if(arr[mid] < k) { first = mid + 1; } else { if(mid == 0 || arr[mid - 1] != k) { return mid; } else { last = mid - 1; } }//else }//while return -1;}int GetLastK(vector
&arr, int first, int last, int k){ while(first <= last) { int mid = (first + last) / 2; if(arr[mid] > k) { last = mid - 1; } else if(arr[mid] < k) { first = mid + 1; } else { if(mid == last || arr[mid + 1] != k) { return mid; } else { first = mid + 1; } }//else }//while return -1;}

在没有查找到k的时候,注意要返回一个标志-1,表示查找未成功。

转载于:https://www.cnblogs.com/stemon/p/4778544.html

你可能感兴趣的文章
apache和tomcat区别_三
查看>>
mac brew安装的mysql 无法远程访问的问题
查看>>
位、字节和字
查看>>
软件测试基础(我以前的一些笔记,希望对大家有帮助,有错漏的地方希望大家指出)...
查看>>
node.js 的错误提示
查看>>
helloword
查看>>
防重复请求处理的实践与总结
查看>>
聊聊hikari连接池的isAllowPoolSuspension
查看>>
从PHP语法糖剖析Zend VM引擎
查看>>
git命令
查看>>
Linux—寻找到的起源!
查看>>
arm-linux gdb调试工具的安装
查看>>
Scala正则表达式问题
查看>>
Oracle自动内存管理的几个小问题
查看>>
dhcp协议交互报文
查看>>
运维学习之openssh-server命令运用及控制
查看>>
Excel如何直接应用主题效果美化工作表
查看>>
Kickstart
查看>>
RAID&LVM
查看>>
探秘腾讯Android手机游戏平台之不安装游戏APK直接启动法
查看>>