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

C++で合計が最小のKペアを検索する


2つのソートされた配列A1とA2、および別の値kがあるとします。 A1の1つの要素とA2の別の要素で構成されるペア(u、v)を定義する必要があります。 [(u1、v1)、(u2、v2)、…、(uk、vk)]のようなkペアを見つける必要があります。したがって、A1 =[1、7、11]およびA2 =[2、4、6]、およびk =3の場合、出力は[(1、2)、(1、4)、(1、6)]になります。

これを解決するには、次の手順に従います-

  • 2つの値aとb、およびインデックスをとる1つのデータ型を定義します。
  • データ型のキーとデータのリストを値として受け取る優先度キューを1つ作成します。
  • n:=A1のサイズ、m:=A2のサイズ
  • nが0またはmが0の場合は、戻ります
  • retと呼ばれる1つの行列を作成します
  • 0からn–1の範囲のiの場合
    • (A1 [i]、A2 [0]、0)をデータとしてキューに挿入します
  • キューが空ではなく、kが0でない場合、
    • curr:=キューの先頭、キュー要素を削除
    • currのfirst_val、currのsecond_valをretに挿入します
    • currのインデックス+1
    • (first_val of curr、A2 [index of curr + 1]、index of curr + 1)を含むデータをキューに挿入します
  • kを1減らします
  • return ret
  • 理解を深めるために、次の実装を見てみましょう-

    #include <bits/stdc++.h>
    #include <stack>
    using namespace std;
    struct Data{
       int firstVal, secondVal, idx;
       Data(int a, int b, int c){
          firstVal = a;
          secondVal = b;
          idx = c;
       }
    };
    struct Comparator{
       bool operator()(Data a, Data b){
          return !(a.firstVal + a.secondVal < b.firstVal + b.secondVal);
       }
    };
    class Solution {
       public:
       vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
          priority_queue <Data, vector <Data>, Comparator> pq;
          int n = nums1.size();
          int m = nums2.size();
          if(!n || !m)return {};
          vector < vector <int> > ret;
          for(int i = 0; i < n; i++){
             pq.push(Data(nums1[i], nums2[0], 0));
          }
          while(!pq.empty() && k--){
             Data curr = pq.top();
             pq.pop();
             ret.push_back({curr.firstVal, curr.secondVal});
             if(curr.idx + 1 < m){
                pq.push(Data(curr.firstVal, nums2[curr.idx + 1], curr.idx + 1));
             }
          }
          return ret;
       }
    };
    void print(vector <int> const &arr) {
       cout<<"[";
       for(int i=0; i < arr.size(); i++)
          std::cout << arr.at(i) <<",";
       cout<<"]";
    }
    int main() {
       vector<int> nums1{1,7,11};
       vector<int> nums2{2,4,6};
       int k = 3;
       Solution ob1;
       vector<vector<int>> numsRet;
       numsRet = ob1.kSmallestPairs(nums1, nums2, k);
       cout<<"[";
       for (vector<int> x : numsRet) {
          print(x);
          cout<<",";
       }
       cout<<"]"<<endl;
       return 0;
    }

    入力

    [1,7,11]
    [2,4,6]
    3
    vector<int> nums1{1,7,11};
    vector<int> nums2{2,4,6};
    int k = 3;
    Solution ob1;
    vector<vector<int>> numsRet;
    numsRet = ob1.kSmallestPairs(nums1, nums2, k);

    出力

    [[1,2,],[1,4,],[1,6,],]

    1. C++でしきい値距離にある近隣の数が最も少ない都市を検索します

      0からn-1までの番号が付けられたn個の都市があるとします。 edge [i] =[fromi、toi、weighti]である配列エッジがある場合、都市fromiとtoiの間の双方向の重み付きエッジを表し、整数の距離しきい値が与えられます。あるパスを介して到達可能で、距離が最大で距離のしきい値である都市の数が最も少ない都市を見つける必要があります。そのような都市が複数ある場合は、最も多い都市を返します。 したがって、入力が-のような場合 nが4で、距離のしきい値も4の場合、出力は3になります。これは- 各都市の距離しきい値=4にある隣接する都市は、- C0 -> [C1, C

    2. C++で指定された違いを持つペアを見つけます

      配列Aがあるとすると、n個の異なる要素があります。 xとyの差が与えられた差dと同じになるように、配列Aからペア(x、y)を見つける必要があります。要素のリストがA=[10、15、26、30、40、70]のようで、差が30の場合、ペアは(10、40)と(30、70)になります この問題を解決するために、配列がソートされていると仮定し、左から2つのポインターをポイント要素に取ります。最初は、最初の1つの「i」が最初の要素を指し、2番目の「j」がポイント要素を指します。 2番目の要素。 A [j] – A [i]がnと同じ場合、ペアを出力します。A[j] – A [i]