在 C++ 中使用 O(1) 额外空间和 O(n) 时间计算数组中所有元素的频率
给定一个包含 1 到 n 的元素的数组。一些元素重复,一些元素缺失。目标是在 O(n) 时间和 O(1) 额外空间内找到所有元素的频率。
输入
Arr[]= { 1,2,2,3,4,4,4,5 }输出
1→ 1, 2 → 2, 3→ 1, 4→ 3, 5→ 5
说明 - 最高元素为 5,输出显示每个元素在数组中出现的次数。
输入
Arr[]= { 1,4,4,5,5,5,5 }输出
1→ 1, 2 →0, 3→ 0, 4→ 2, 5→ 4
说明 - 最高元素为 5,输出显示每个元素在数组中出现的次数。
下面程序中使用的方案如下
以下程序适用于数字在 1 到 10 之间的数组。
函数 printfrequency(int arr[],int n) 以数组及其大小 n 作为输入,并返回数组中存在的 1 到 10 之间的数字的计数。
我们使 arr[i]=arr[i]-1,以便每个索引存储数字 i 的频率,1 存储在索引 0 处,依此类推。
使用 for 循环,在每个频率 arr[arr[i]%10] 中,将 10 加到原始值上。
如果数字 i 在数组中出现 x 次,则会添加 x 次 10。
现在使用 for 循环,使用 arr[i]/10 打印所有元素 i+1 在索引 i 处的频率。
示例
#include<bits/stdc++.h>
using namespace std;
void printfrequency(int arr[],int n){
int i=0;
//1 becomes 0, 2 becomes 1 .....10 becomes 9 so arr[i] will have count of i
for ( i =0; i<n; i++)
arr[i] = arr[i]-1;
//as numbers are between 1-10 add 10 to all (num%10 is num itself)
for (i=0; i<n; i++)
arr[arr[i]%10] = arr[arr[i]%10] + 10;
for (i =0; i<10; i++)
cout << i + 1 << " -> " << arr[i]/10 << endl;
}
int main(){
int arr[] = {2, 3, 3, 2, 5, 6, 7, 7, 7, 8, 8, 9, 9};
int n = sizeof(arr)/sizeof(arr[0]);
printfrequency(arr,n);
return 0;
}输出
1 -> 0 2 -> 2 3 -> 2 4 -> 0 5 -> 1 6 -> 1 7 -> 3 8 -> 2 9 -> 5 10 -> 0
广告
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP