升序数组中求一个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

相关文章

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

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