在 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

更新於: 2020-07-28

1K+ 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告