`

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

 

0
1
分享到:
评论

相关推荐

    php数组函数分类

    - **array_count_values()**: 对数组中所有值进行计数,返回一个键为原数组值,值为出现次数的新数组。 #### 搜索(Search) 此类函数用于在数组中查找特定的键或值。 - **isset()**: 检测变量是否设置并且非空。...

    PHP 多维数组的排序问题 根据二维数组中某个项排序

    例如,假设我们有一个二维数组,每个子数组包含地区信息以及与该地区相关的“人数”和“次数”,我们需要根据这两个字段进行降序排序。首先,我们需要从原始的二维数组中提取这两个字段,然后将它们作为独立的数组...

    php数组的操作大全

    - `array_count_values($arr)`:统计数组中每个值出现的次数,返回一个新数组。 通过这些操作,开发者可以灵活地创建、管理和操作数组,满足各种复杂的编程需求。了解和熟练掌握这些函数对于编写高效、健壮的PHP...

    PHP 数组的特殊操作

    如果需要统计数组中某个值出现的次数,`array_count_values()`函数会派上用场。 在进行数组处理时,我们可能会遇到嵌套数组,即数组中的元素本身就是数组。这时,可以使用递归函数或者`array_walk_recursive()`遍历...

    PHP数组详解.pdf

    - `array_count_values()`统计数组中每个值出现的次数。 - `array_unique()`去除数组中的重复值。 3. 回调函数处理: - `array_filter()`过滤数组元素。 - `array_walk()`遍历数组并应用用户提供的函数。 - `...

    php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】

    例如,`array_count_values($input_array)` 返回一个新数组,其中键是原始数组的值,值是它们在原始数组中出现的次数。 5. **数组添加**: 可以直接使用索引或键来向数组添加元素,如 `$array[] = 'new_value';` ...

    php数组——记忆卡

    每个数组元素都由一个键(key)和一个值(value)组成。键用来唯一标识数组中的元素,并且可以通过键来访问该元素的值。 ##### 2. 创建数组 在PHP中,可以通过不同的方式来创建数组: - **简单格式**: ```php ...

    PHP数组相关函数汇总_.docx

    - 功能:计算数组中每个值出现的次数。 - 示例:`$valueCounts = array_count_values($arr);` 4. **array_fill(1.下标从几开始2.输出多少个3.他们的值是什么)** - 功能:创建一个包含重复元素的数组。 - 示例...

    基于PHP中的常用函数回顾

    4. **array_count_values**:统计数组中所有不同值出现的次数,返回一个新数组,键为原数组中的值,值为对应的计数值。 5. **array_diff_assoc, array_diff_key, array_diff_uassoc, array_diff_ukey, array_diff**...

    php常用操作数组的函数.docx

    9. `array_count_values()`:计算数组中各个值出现的次数,返回一个新的数组,其中键是原数组的值,值是对应的计数。 10. `array_fill()`:用指定的值填充数组的一个区间。例如,`Array_fill(10, 100, 'useli')` 会...

    php中的数组操作函数整理

    4. **array_count_values**:统计数组中所有不同值出现的次数,并返回一个包含这些计数的新数组。 5. **array_diff_assoc**:计算两个或多个数组的差集,同时检查索引,只保留存在于第一个数组但不在其他数组中的...

    PHP获取数组最大值下标的方法

    - `array_count_values()`:这个函数可以用来计算数组中不同值出现的次数,这对于统计分析非常有用。 - `array_sum()`:计算数组所有元素的值之和,用于求和操作。 - `array_product()`:与 `array_sum()` 类似,但...

    解析php二分法查找数组是否包含某一元素

    接着,通过比较数组的第一个元素和最后一个元素判断数组是否按升序排列,将结果存储在 `$isAscSort` 变量中。 进入`while`循环,计算中间索引 `$midKey`。这里使用了条件运算符来处理奇数长度的数组,确保中间索引...

    PHP 数组基础知识小结

    - `array_count_values()`:统计数组中各个值出现的次数。 - `array_unique()`:删除数组中的重复值。 ```php // 获取数组长度 $array_length = count($numbers); // 统计数组中各个值出现的次数 $counts = array_...

    华为机考模拟题一的答案

    - 使用一个循环来遍历数组中的每个元素。 - 如果当前元素不等于其正确值(即当前索引加1),则找到其正确值的位置,并与当前位置的元素进行交换。 - 维护一个计数器来记录交换次数。 **示例代码:** ```python ...

    数据结构与算法题解

    - 实例问题:在一个升序排列的数组中查找特定值的位置。 - **数学(Math)** - 解决数学问题的算法。 - 实例问题:实现求最大公约数的算法。 - **最大公约数(GreatestCommonDivisor)** - 求两个或多个整数共有...

    php代码-数组函数测试

    - `array_count_values()`: 统计数组中每个值出现的次数。 6. **数组键值操作** - `array_keys()`: 返回数组中的所有键。 - `array_values()`: 返回数组中的所有值。 - `array_change_key_case()`: 改变数组的...

    PHP数组及条件,循环语句学习

    在PHP编程语言中,数组是一种非常重要的数据结构,它允许我们存储多个值在一个单一的变量中。数组可以是数字索引的,也可以是关联的,或者是两者混合的。本篇文章将深入探讨PHP中的数组和条件、循环语句的学习。 ##...

    写出二分法查找算法函数实现。

    给定一个已经按照升序排序的数组 `value` 和一个待查找的关键字 `key`,我们需要编写一个函数 `binarySearch` 来实现二分查找。该函数需要返回 `key` 在数组中的索引位置,如果 `key` 不存在于数组中,则返回 `-1`。...

    PHP操作数组的一些函数整理介绍

    6. **array_count_values()**: 用于统计数组中每个元素出现的频率,返回一个关联数组,键是原数组中的元素,值是它们的出现次数。 7. **array_unique()**: 删除数组中的重复值,返回一个新的包含唯一值的数组,保持...

Global site tag (gtag.js) - Google Analytics