使用 C++ 統計滿足條件的 (p, q) 對數:p 在陣列中至少出現 q 次,q 在陣列中至少出現 p 次。


給定一個正整數陣列。目標是找到陣列元素對的數量,這些元素對具有元素 (p, q),其中 p 在陣列中至少出現 q 次,而 q 在陣列中至少出現 p 次。

讓我們透過例子來理解。

輸入 − int arr[] = { 3, 3, 3, 5, 5, 6, 6}

輸出 − 陣列中滿足條件的 (p,q) 對的數量為 1

解釋 − 陣列中滿足 p 至少出現 q 次且 q 至少出現 p 次的有效對是 (3, 3),因為 3 在陣列中出現了 3 次。因此只有一個有效對,計數為 1。

輸入 − int arr[] = { 3, 3, 3, 3, 3, 5, 5, 5, 6, 6}

輸出 − 陣列中滿足條件的 (p,q) 對的數量為 1

解釋 − 陣列中滿足 p 至少出現 q 次且 q 至少出現 p 次的有效對是 (3, 3), (5, 5) 和 (3, 5),因為 3 出現了 5 次,而 5 出現了 3 次。因此有三個有效對,計數為 3。

下面程式中使用的方法如下

  • 輸入一個整數元素陣列,計算陣列大小,並將資料傳遞給函式以進行進一步處理。

  • 宣告一個臨時變數 count 來儲存 p 和 q 的出現次數。

  • 建立一個 vector 型別的變數 vec 和 unordered_map 型別的變數 um。

  • 從 0 開始迴圈到陣列大小。

  • 在迴圈內,將 um[arr[i]] 設定為 1,並檢查 IF um 為 1,則將 arr[i] 推入向量。

  • 從 0 開始另一個迴圈到向量的長度,並檢查 IF um[vec[i] < vec[i] 則繼續,ELSE IF 它們相等,則將計數加 1,ELSE 將計數加 1。從 j 開始另一個迴圈 j 到 vec[i] + 1 直到 um[vec[i]]。

  • 在迴圈 j 內,檢查 IF um[j] >= vec[i],則將計數加 1。

  • 返回計數。

  • 列印結果。

示例

 線上演示

#include <bits/stdc++.h>
using namespace std;
int pair_count(int arr[], int len){
   int count = 0;
   vector<int> vec;
   unordered_map<int, int> um;
   for (int i = 0; i < len; i++){
      um[arr[i]]++;
      if (um[arr[i]] == 1){
         vec.push_back(arr[i]);
      }
   }
   for (int i = 0; i < vec.size(); i++){
      if (um[vec[i]] < vec[i]){
         continue;
      }
      else if (um[vec[i]] == vec[i]){
         count++;;
      }
      else{
         count++;
         for (int j = vec[i] + 1; j <= um[vec[i]]; j++){
            if (um[j] >= vec[i]){
               count++;
            }
         }
      }
   }
   return count;
}
int main(){
   int arr[] = { 1, 1, 1, 5, 5, 1};
   int size = sizeof(arr) / sizeof(arr[0]);
   cout<<"Count of pairs (p, q) such that p occurs in array at least q times and q occurs at least
p times are: "<<pair_count(arr, size);
   return 0;
}

輸出

如果我們執行以上程式碼,它將生成以下輸出:

Count of pairs (p, q) such that p occurs in array at least q times and q occurs at least p times are: 1

更新於:2020年12月2日

瀏覽量 189 次

開啟你的職業生涯

完成課程並獲得認證

開始學習
廣告