升序数组中求一个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枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

MySQL中Next-Key Lock底层原理实现

《MySQL中Next-KeyLock底层原理实现》Next-KeyLock是MySQLInnoDB存储引擎中的一种锁机制,结合记录锁和间隙锁,用于高效并发控制并避免幻读,本文主要介绍了MySQL中... 目录一、Next-Key Lock 的定义与作用二、底层原理三、源代码解析四、总结Next-Key L

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

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