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
-
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
-
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