升序数组中求一个key出现的次数

2023-10-08 14:48
文章标签 数组 次数 key 中求 升序

本文主要是介绍升序数组中求一个key出现的次数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

算法思路: 在排好序的数组,相同的数字是排列在一起的,所以只需要找到key的左边界和右边界即可。

找左边界可以看成是找数组中第一个大于等于key的数的位置,找右边界可以看成是找最后一个小于等于key的数。

复杂度分析:时间复杂度是O(log(n)),空间复杂度是O(n)。

 

#include <stdio.h>
/** @brief 在升序数组a中找到第一个大于等于key的数的位置,如果不存在这样的位置,例如* 数组a中所有的数字都比key小,则返回的数是n* @parma int* a 升序数组* @parma int n  数组a的长度* @int key 待查找的关键字*/
int find_left(int* a, int n, int key){int l, r, mid; l = 0; r = n-1;while(l <= r){int mid = (l+r) >> 1; if(a[mid] >= key) r=mid-1; else l=mid+1; }return r+1; 
}/** @brief 在升序数组a中找到最后一个小于等于key的数的位置,如果不存在这样的位置,例如* 数组a中所有的数字都比key大,则返回的数是-1* @parma int* a 升序数组* @parma int n  数组a的长度* @int key 待查找的关键字*/
int find_right(int* a, int n, int key){int l, r, mid; l = 0; r = n-1;while(l <= r){int mid = (l+r)>>1; if(a[mid] <= key) l = mid + 1; else r = mid - 1; }    return l-1; 
}
int count(int* a, int n, int key){int l = find_left(a, n, key);int r = find_right(a, n, key);int cnt = r-l+1; return cnt; 
}
int main(){//输入和输出重定向freopen("in.txt","r", stdin);freopen("out.txt", "w", stdout);const int N = 4; int a[N] = {2, 4, 4, 5}, key; //use case 1:key比数组中所有的数都要小key = 1; printf("%d出现的次数是%d\n", key, count(a, N, key));//use case 2:key在数组出现了一次key = 2; printf("%d出现的次数是%d\n", key, count(a, N, key));//use case 3:key在数组出现了不止一次key = 4; printf("%d出现的次数是%d\n", key, count(a, N, key));//use case 4:key不在数组中,但大于数组中的最小数,小于数组中的最大数key = 3; printf("%d出现的次数是%d\n", key, count(a, N, key));//use case 5:key比数组中的最大数还大key = 6; printf("%d出现的次数是%d\n", key, count(a, N, key));return 0; 
}

 输出结果如下:

1出现的次数是0

2出现的次数是1

4出现的次数是2

3出现的次数是0

6出现的次数是0

 

这篇关于升序数组中求一个key出现的次数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/166040

相关文章

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

git ssh key相关

step1、进入.ssh文件夹   (windows下 下载git客户端)   cd ~/.ssh(windows mkdir ~/.ssh) step2、配置name和email git config --global user.name "你的名称"git config --global user.email "你的邮箱" step3、生成key ssh-keygen

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

计算数组的斜率,偏移,R2

模拟Excel中的R2的计算。         public bool fnCheckRear_R2(List<double[]> lRear, int iMinRear, int iMaxRear, ref double dR2)         {             bool bResult = true;             int n = 0;             dou

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed

DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed 文章目录 DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed问题解决办法 问题 使用 DBeaver 连接 MySQL 数据库的时候, 一直报错下面的错误 Public Key Retrieval is