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