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

別の配列からの値が小さい配列のC++順列


このチュートリアルでは、AとBの2つの配列が提供されています。たとえば、A [I]> B [I]のインデックスが最大化されるように、Aの順列を出力する必要があります。たとえば

Input: A = [12, 22, 41, 13],
B = [1, 20, 10, 12]
Output: 12, 22, 41, 13

Input: A = [2, 5, 9, 7],
B = [1, 12, 4, 54]
Output: 2 7 5 9

Multiple answers can be present in that case we are simply going to print any one of the answers.

この問題では、A [i]> B [i]のインデックスを最大化する必要があるため、この問題を貪欲に解決します。

解決策を見つけるためのアプローチ

このアプローチでは、最初に両方の配列をソートします。 A [i]がそれよりも重要であるように、配列Bの各インデックスを貪欲にチェックしてから、その要素をベクトルに配置します。

#include <bits/stdc++.h>
using namespace std;
int main(){
    int A[] = { 2, 5, 9, 7 };
    int B[] = { 1, 12, 4, 54 };
    int n = sizeof(A) / sizeof(int); // size of our arrays
    vector<pair<int, int> > A_pair, B_pair;
    /***********************We are linking element to its position***********/
    for (int i = 0; i < n; i++)
        A_pair.push_back({A[i], i});
    for (int i = 0; i < n; i++)
        B_pair.push_back({B[i], i});
    /***********************************************************************/
    /*****Sorting our pair vectors********************/
    sort(A_pair.begin(), A_pair.end());
    sort(B_pair.begin(), B_pair.end());
    int i = 0, j = 0, ans[n];
    memset(ans, -1, sizeof(ans)); // initializing all the elements with value -1
    vector<int> remaining; // this will store our elements which have lesser value than elemnt present in B.
    while (i < n && j < n) {
        // as our array is sorted then if we find any element in
        //current index which has less value than B of current index then
        // automatically it will have less value than other elements of B
        // that's why we push such indices in remaining otherwise we push element in ans
        if (A_pair[i].first > B_pair[j].first) {
            ans[B_pair[j].second] = A_pair[i].first;
            i++;
            j++;
        }
        else {
            remaining.push_back(i);
            i++;
        }
    }
    j = 0;
    for (int i = 0; i < n; ++i){
        // now if any index of answer is unchanged so that means
        //we need to fill that position with the remaining elements
        if (ans[i] == -1){
            ans[i] = A_pair[remaining[j]].first;
            j++;
        }
    }
    for (int i = 0; i < n; i++) // printing our answer
        cout << ans[i] << " ";
    return 0;
}

出力

2 7 5 9

上記のコードの説明

このアプローチでは、最初にすべての要素をそれらのインデックスにリンクして、ソート時に古いインデックスが残っているようにします。ペアの両方のベクトルを並べ替えます。B_pairよりも優れた値を持つA_pairのインデックスを取得した場合、両方の配列を移動しながら、答えを貪欲に検索します。そのため、それを配列(およびB_pairの位置)elseは両方のベクトルを並べ替えたため、このA_pairの値を使用できないことがわかっているので、残りのベクトルの要素インデックスをプッシュして、残りの助けを借りて配列を埋めます。ベクトル、そして答えを印刷します。

結論

このチュートリアルでは、問題を解決して、別の配列から値が小さい配列の順列を見つけます。また、この問題のC ++プログラムと、解決した完全なアプローチについても学びました。同じプログラムを、C、java、python、その他の言語などの他の言語で作成できます。このチュートリアルがお役に立てば幸いです。


  1. C ++で最初に0、次に1になるように、バイナリ配列を分割するための最小トグル

    問題の説明 0と1のみを含むn個の整数の配列が与えられた場合、配列がパーティション化される、つまり最初に0、次に1になるように、必要な最小のトグル(0から1に、またはその逆に切り替える)を見つけます。 例 arr [] ={1、0、0、1、1、1、0}の場合、2つのトグルが必要です。つまり、最初の1つと最後のゼロをトグルします。 アルゴリズム 質問を観察すると、0からn-1までのポイントが確実に存在し、そのポイントまでのすべての要素にすべて0が含まれ、右からポイントにすべて1が含まれる必要があることがわかります。 この法律に従わないインデックスは削除する必要があります。アイデアは、すべて

  2. XORがC++の別の配列と等しくなるように、2つのバイナリ配列の最小フリップ。

    問題の説明 サイズnの0と1の3つの配列が与えられた場合、タスクは、1番目と2番目の配列のi番目のインデックスビットのXORがi番目のインデックスビットと等しくなるように、1番目と2番目の配列のビットの最小フリップを見つけることです。 3番目の配列。 反転できるのは、配列1の最大pビットと配列2の最大qビットのみであることに注意してください。また、配列要素の再配置は許可されていません。 p=2およびq=5と仮定します arr1[] = {1, 0, 1, 1, 0, 1, 0} arr2[] = {0, 1, 0, 1, 0, 0, 1} arr3[] = {0, 1, 1, 0, 0,