別の配列からの値が小さい配列の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,