算法思路: 在排好序的数组,相同的数字是排列在一起的,所以只需要找到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
分享到:
相关推荐
- **array_count_values()**: 对数组中所有值进行计数,返回一个键为原数组值,值为出现次数的新数组。 #### 搜索(Search) 此类函数用于在数组中查找特定的键或值。 - **isset()**: 检测变量是否设置并且非空。...
例如,假设我们有一个二维数组,每个子数组包含地区信息以及与该地区相关的“人数”和“次数”,我们需要根据这两个字段进行降序排序。首先,我们需要从原始的二维数组中提取这两个字段,然后将它们作为独立的数组...
- `array_count_values($arr)`:统计数组中每个值出现的次数,返回一个新数组。 通过这些操作,开发者可以灵活地创建、管理和操作数组,满足各种复杂的编程需求。了解和熟练掌握这些函数对于编写高效、健壮的PHP...
如果需要统计数组中某个值出现的次数,`array_count_values()`函数会派上用场。 在进行数组处理时,我们可能会遇到嵌套数组,即数组中的元素本身就是数组。这时,可以使用递归函数或者`array_walk_recursive()`遍历...
- `array_count_values()`统计数组中每个值出现的次数。 - `array_unique()`去除数组中的重复值。 3. 回调函数处理: - `array_filter()`过滤数组元素。 - `array_walk()`遍历数组并应用用户提供的函数。 - `...
例如,`array_count_values($input_array)` 返回一个新数组,其中键是原始数组的值,值是它们在原始数组中出现的次数。 5. **数组添加**: 可以直接使用索引或键来向数组添加元素,如 `$array[] = 'new_value';` ...
每个数组元素都由一个键(key)和一个值(value)组成。键用来唯一标识数组中的元素,并且可以通过键来访问该元素的值。 ##### 2. 创建数组 在PHP中,可以通过不同的方式来创建数组: - **简单格式**: ```php ...
- 功能:计算数组中每个值出现的次数。 - 示例:`$valueCounts = array_count_values($arr);` 4. **array_fill(1.下标从几开始2.输出多少个3.他们的值是什么)** - 功能:创建一个包含重复元素的数组。 - 示例...
4. **array_count_values**:统计数组中所有不同值出现的次数,返回一个新数组,键为原数组中的值,值为对应的计数值。 5. **array_diff_assoc, array_diff_key, array_diff_uassoc, array_diff_ukey, array_diff**...
9. `array_count_values()`:计算数组中各个值出现的次数,返回一个新的数组,其中键是原数组的值,值是对应的计数。 10. `array_fill()`:用指定的值填充数组的一个区间。例如,`Array_fill(10, 100, 'useli')` 会...
4. **array_count_values**:统计数组中所有不同值出现的次数,并返回一个包含这些计数的新数组。 5. **array_diff_assoc**:计算两个或多个数组的差集,同时检查索引,只保留存在于第一个数组但不在其他数组中的...
- `array_count_values()`:这个函数可以用来计算数组中不同值出现的次数,这对于统计分析非常有用。 - `array_sum()`:计算数组所有元素的值之和,用于求和操作。 - `array_product()`:与 `array_sum()` 类似,但...
接着,通过比较数组的第一个元素和最后一个元素判断数组是否按升序排列,将结果存储在 `$isAscSort` 变量中。 进入`while`循环,计算中间索引 `$midKey`。这里使用了条件运算符来处理奇数长度的数组,确保中间索引...
- `array_count_values()`:统计数组中各个值出现的次数。 - `array_unique()`:删除数组中的重复值。 ```php // 获取数组长度 $array_length = count($numbers); // 统计数组中各个值出现的次数 $counts = array_...
- 使用一个循环来遍历数组中的每个元素。 - 如果当前元素不等于其正确值(即当前索引加1),则找到其正确值的位置,并与当前位置的元素进行交换。 - 维护一个计数器来记录交换次数。 **示例代码:** ```python ...
- 实例问题:在一个升序排列的数组中查找特定值的位置。 - **数学(Math)** - 解决数学问题的算法。 - 实例问题:实现求最大公约数的算法。 - **最大公约数(GreatestCommonDivisor)** - 求两个或多个整数共有...
- `array_count_values()`: 统计数组中每个值出现的次数。 6. **数组键值操作** - `array_keys()`: 返回数组中的所有键。 - `array_values()`: 返回数组中的所有值。 - `array_change_key_case()`: 改变数组的...
在PHP编程语言中,数组是一种非常重要的数据结构,它允许我们存储多个值在一个单一的变量中。数组可以是数字索引的,也可以是关联的,或者是两者混合的。本篇文章将深入探讨PHP中的数组和条件、循环语句的学习。 ##...
给定一个已经按照升序排序的数组 `value` 和一个待查找的关键字 `key`,我们需要编写一个函数 `binarySearch` 来实现二分查找。该函数需要返回 `key` 在数组中的索引位置,如果 `key` 不存在于数组中,则返回 `-1`。...
6. **array_count_values()**: 用于统计数组中每个元素出现的频率,返回一个关联数组,键是原数组中的元素,值是它们的出现次数。 7. **array_unique()**: 删除数组中的重复值,返回一个新的包含唯一值的数组,保持...