別の配列からの値が小さい配列の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、その他の言語などの他の言語で作成できます。このチュートリアルがお役に立てば幸いです。
-
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が含まれる必要があることがわかります。 この法律に従わないインデックスは削除する必要があります。アイデアは、すべて
-
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,