博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数字在排序数组中出现的次数
阅读量:4572 次
发布时间:2019-06-08

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

题目:统计一个数字在排序数组中出现的次数.例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于在这个数组中出现了4次,因此输出4.

使用二分查找,基本思想:先查找该数字第一次出现的位置,然后查找该数字最后一次出现的位置.代码如下:

1 #include 
2 #include
3 #include
4 5 int get_first_k(int *, int, int, int); 6 int get_last_k(int *, int, int, int); 7 8 int main(int argc, char *argv[]) 9 { 10 int a[13] = {
1, 2, 5, 5, 5, 5, 16, 20, 23, 24, 28, 30, 43}; 11 int b = 430; 12 int num = 0; 13 int first = 0; 14 int last = 0; 15 16 first = get_first_k(a, b, 0, sizeof(a)/sizeof(int) - 1); 17 if (first == -1) 18 { 19 printf("不存在该数字\n"); 20 return 0; 21 } 22 23 last = get_last_k(a, b, 0, sizeof(a)/sizeof(int) - 1); 24 printf("%d %d\n", first, last); 25 num = last - first + 1; 26 printf("%d\n", num); 27 28 29 return 0; 30 } 31 /* 32 int search(int *a, int target, int p, int r) 33 { 34 if (p <= r) 35 { 36 int mid; 37 38 mid = (p + r) / 2; 39 if (*(a + mid) == target) 40 return 1; 41 else if (*(a + mid) > target) 42 return search(a, target, p, mid - 1); 43 else 44 return search(a, target, mid + 1, r); 45 } 46 return 0; 47 } 48 */ 49 int get_first_k(int *a, int target, int p, int r) 50 { 51 int mid = 0; 52 53 while (p <= r) 54 { 55 mid = (p + r) / 2; 56 if (*(a + mid) == target) 57 { 58 if (mid == 0 || *(a + mid - 1) != target) 59 { 60 return mid; 61 } 62 else 63 { 64 r = mid - 1; 65 } 66 } 67 else if (*(a + mid) > target) 68 { 69 r = mid - 1; 70 } 71 else 72 { 73 p = mid + 1; 74 } 75 76 } 77 78 return -1; 79 } 80 81 int get_last_k(int *a, int target, int p, int r) 82 { 83 int mid = 0; 84 int len = r - p + 1; 85 86 while (p <= r) 87 { 88 mid = (p + r) / 2; 89 if (*(a + mid) == target) 90 { 91 if (mid == len - 1 || *(a + mid + 1) != target) 92 { 93 return mid; 94 } 95 else 96 { 97 p = mid + 1; 98 } 99 }100 else if (*(a + mid) > target)101 {102 r = mid - 1;103 }104 else105 {106 p = mid + 1;107 }108 }109 return -1;110 }

 

转载于:https://www.cnblogs.com/yyxayz/p/4064336.html

你可能感兴趣的文章
CDHD驱动器——ServoStudio配置高创伺服速度模式不转
查看>>
完整版本的停车场管理系统源代码带服务端+手机android客户端
查看>>
【UOJ 92】有向图的强联通分量
查看>>
bzoj 1192
查看>>
Windows10/Servers 2016的TrustedInstaller权限获取(及乱改System后救砖
查看>>
关于mysql转移数据库时没有导出sql脚本的情况下,如何导入数据到新的数据库中...
查看>>
链表逆序
查看>>
[zz]链表倒序
查看>>
简单易用的图像解码库介绍 —— stb_image
查看>>
【漏洞复现】永恒之蓝 ms17-010 漏洞利用 攻击手法
查看>>
HTML标签(二)
查看>>
在weblogic下运行Python脚本
查看>>
短信开发技术总结--协议篇
查看>>
HashMap实现原理分析
查看>>
私有类方法
查看>>
java网络编程Socket通信详解
查看>>
为什么使用Nosql:Nosql和SQL的区别
查看>>
<转>DNS服务系列之二:DNS区域传送漏洞的安全案例
查看>>
LINUX中常用操作命令
查看>>
【android】动画效果研究(View)【1】
查看>>