C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++のk個のソートされた配列でm番目に小さい値を検索します


この問題では、さまざまなサイズのk個の異なる配列が与えられます。私たちのタスクは、k個のソートされた配列でm番目に小さい値を見つけることです。

問題の説明: ここでは、k個の配列すべてのマージされた配列のm番目に小さい要素を見つける必要があります。

問題を理解するために例を見てみましょう。

入力: m =4

arr [] [] ={{4、7}、
{2、5、6}、
{3、9、12、15、19}}

出力: 5

説明:

マージされたソート済み配列:2、3、4、5、6、7、9、12、15、19

4番目の要素は5です。

ソリューションアプローチ:

m番目に小さい要素を見つける簡単な解決策は、マージされた配列を作成し、配列のm番目に小さい要素がインデックス(m-1)になる昇順で配列を並べ替えることです。この出力値を返します。

より効果的な解決策は、最小ヒープを使用することです。 データ構造。

このために、最小ヒープを作成し、すべての配列から要素を挿入します。次に、m回、最小要素要素をヒープから削除し、出力を配列に格納します。次に、次の要素をヒープに挿入します。

m番目に削除されたアイテムを印刷します。

ソリューションの動作を説明するプログラム

#include <bits/stdc++.h>
using namespace std;

typedef pair<int, pair<int, int> > ppi;

int findMSmallestElement(vector<vector<int> > sortedArr, int m) {
   
   priority_queue<ppi, vector<ppi>, greater<ppi> > priorQueue;

   for (int i = 0; i < sortedArr.size(); i++)
      priorQueue.push({ sortedArr[i][0], { i, 0 } });
   int count = 0;
   int i = 0, j = 0;
   while (count < m && priorQueue.empty() == false) {
      ppi curr = priorQueue.top();
      priorQueue.pop();
      i = curr.second.first;
      j = curr.second.second;
      if (j + 1 < sortedArr[i].size())
         priorQueue.push( { sortedArr[i][j + 1], { i, (j + 1) } });
      count++;
   }
   return sortedArr[i][j];
}

int main() {
   
   vector<vector<int> > arr{ {4 , 7},
                         {2, 5, 6},
                         {3, 9, 12, 15, 19}};
   int m = 6;
   cout<<m<<"th smallest value in k sorted arrays is "<<findMSmallestElement(arr, m);

   return 0;
}

出力

6th smallest value in k sorted arrays is 7

  1. C++の配列で最小値の頻度を見つける

    ここでは、配列内の最小要素の頻度を見つける方法を説明します。配列要素が[5、3、6、9、3、7、5、8、3、12、3、10]であると仮定します。ここで、最小要素は3であり、この要素の頻度は4です。したがって出力は4です。 。 これを解決するために、リストの最小の要素を見つけ、最初の数字の出現を数え、それが結果になります。 例 #include<iostream> using namespace std;    int min_element(int arr[], int n){    int min = arr[0];   &nb

  2. C++を使用して2つのソートされた配列をマージします。

    問題の説明 与えられた2つのソートされた配列リスト。与えられた2つのソートされた配列を1つにマージする関数を記述します Arr1[] = {10,15, 17, 20} Arr2[] = {5, 9, 13, 19} Result[] = {5, 9, 10, 13, 15, 17, 19, 20} アルゴリズム 1. Traverse both array    1.1. If arr1[i] < arr2[j]       1.1.1. Add arr[i] to new array       1.1