C++のk個のリストから要素を含む最小範囲を検索します
k個の異なるリストがあるとします。要素が並べ替えられます。 k個の異なるリストのそれぞれから少なくとも1つの番号を含む最小範囲を検索する必要があります。ここで、範囲[a、b]は、b-a
したがって、入力が[[4,10,15,25,26]、[0,9,14,20]、[5,18,24,30]]の場合、出力は[14、18]になります。
これを解決するには、次の手順に従います-
-
minRange:=inf、maxRange:=-inf、rangeSize:=inf、tempMinRange:=inf、tempMaxRange:=-inf
-
n:=numsのサイズ
-
サイズnの配列ポインタを定義する
-
優先キューを作成するpq
-
初期化i:=0の場合、i
-
{nums [i、0]、i}をpq
に挿入します -
tempMaxRange:=tempMaxRangeとnums[i、0]の最大値
-
-
1がゼロ以外の場合、実行-
-
1つのペアを定義しますtemp:=top of pq
-
pqから要素を削除する
-
tempMinRange:=temp.first
-
idx:=tempの2番目の要素
-
tempMaxRange --tempMinRange
-
rangeSize:=tempMaxRange --tempMinRange
-
minRange:=tempMinRange
-
maxRange:=tempMaxRange
-
-
(pointers [idx]を1増やします)
-
ポインタ[idx]がnums[idx]のサイズと同じである場合、-
-
ループから出てきます
-
-
それ以外の場合
-
tempMaxRange:=tempMaxRangeとnums[idx、pointers [idx]]
の最大値 -
{nums [idx、pointers [idx]]、idx}をpq
に挿入します
-
-
-
サイズ2の配列を定義します
-
ans [0]:=minRange、ans [1]:=maxRange
-
ansを返す
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } struct Comparator{ bool operator() (pair <int, int> a, pair <int, int> b){ return !(a.first < b.first); } }; class Solution { public: vector<int> smallestRange(vector<vector<int>>& nums) { int minRange = INT_MAX; int maxRange = INT_MIN; int rangeSize = INT_MAX; int tempMinRange, tempMaxRange, tempRangeSize; tempMinRange = INT_MAX; tempMaxRange = INT_MIN; int n = nums.size(); vector <int> pointers(n); priority_queue < pair <int, int>, vector < pair <int, int> >, Comparator > pq; for(int i = 0; i < n; i++){ pq.push({nums[i][0], i}); tempMaxRange = max(tempMaxRange, nums[i][0]); } while(1){ pair <int, int> temp = pq.top(); pq.pop(); tempMinRange = temp.first; int idx = temp.second; if(tempMaxRange - tempMinRange < rangeSize){ rangeSize = tempMaxRange - tempMinRange; minRange = tempMinRange; maxRange = tempMaxRange; } pointers[idx]++; if(pointers[idx] == nums[idx].size())break; else{ tempMaxRange = max(tempMaxRange, nums[idx][pointers[idx]]); pq.push({nums[idx][pointers[idx]], idx}); } } vector <int> ans(2); ans[0] = minRange; ans[1] = maxRange; return ans; } }; main(){ Solution ob; vector<vector<int>> v = {{4,10,15,25,26},{0,9,14,20},{5,18,24,30}}; print_vector(ob.smallestRange(v)); }
入力
{{4,10,15,25,26},{0,9,14,20},{5,18,24,30}};
出力
[14, 18, ]
-
C++で指定された値に最も近いk個の要素を検索します
要素が少ない配列Aがあるとします。他に2つの値Xとkがあります。私たちのタスクは、配列AからXの最も近い要素のk個を見つけることです。要素Xが配列に存在する場合、それは出力に表示されません。 A =[12、16、22、30、35、39、42、45、48、50、53、55、56]およびX =35、k =4の場合、出力は30、39、42、45になります。 。 これを解決するために、二分探索アプローチを使用します。これを使用して、クロスオーバーポイントを取得します。クロスオーバーポイントのインデックスが見つかった場合、O(k)時間でk個の最も近い要素を出力できます。 例 #include<i
-
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