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

C ++を使用して、arr[i]がO(1)の余分なスペースでarr[arr[i]]になるように配列を再配置します。


正の整数型の配列、たとえば、配列内の要素の値が0より大きく、配列のサイズよりも小さい任意のサイズのarr[]が与えられます。タスクは、指定されたO(1)スペース内でのみarr[i]がarr[arr [i]]になるように配列を再配置し、最終結果を出力することです。

このためのさまざまな入出力シナリオを見てみましょう-

入力 − int arr [] ={0 3 2 1 5 4}

出力 −配置前の配列:0 3 2 1 5 4 arr[i]がO(1)の余分なスペースでarr [arr [i]]になるように配列を再配置すると、次のようになります。0 1 2 3 4 5

説明 −サイズ6の整数配列と、6未満の配列値のすべての要素が与えられます。次に、配列を再配置します。つまり、arr [arr [0]は0、arr [arr [1]]は1、arr [arr [2]]は2、arr [arr [3]]は3、arr [arr [4]]は4、arr [arr [5]]は5です。したがって、再配置後の最終的な配列は012です。 3 4 5.

入力 − int arr [] ={1、0}

出力 −配置前の配列:1 0 arr[i]がO(1)の余分なスペースでarr [arr [i]]になるように配列を再配置すると、次のようになります。0 1

説明 −サイズ2の整数配列と、2未満の配列値のすべての要素が与えられます。次に、配列を再配置します。つまり、arr [arr [0]は1、arr [arr[1]]は0です。 、再配置後の最終的な配列は01です。

入力 − int arr [] ={1、0、2、3}

出力 −配置前の配列:1 0 2 3 arr[i]がO(1)の余分なスペースでarr [arr [i]]になるように配列を再配置すると、次のようになります。0 1 2 3

説明 −サイズ4の整数配列と、4未満の配列値のすべての要素が与えられます。次に、配列を再配置します。つまり、arr [arr [0]は0、arr [arr [1]]は1、arr [arr [2]]は2、arr [arr [3]]は3です。したがって、再配置後の最終的な配列は0 123です。

以下のプログラムで使用されているアプローチは次のとおりです

  • 整数型要素の配列を入力し、配列のサイズを計算します

  • 配列の前に配列を印刷し、関数Rearrangement(arr、size)を呼び出します

  • 関数Rearrangement(arr、size)の内部

    • iがサイズより小さくなるまでiから0までループFORを開始します。ループ内で、tempをarr [arr [i]]%sizeおよびarr [i] + =temp*sizeとして設定します。

    • iがサイズより小さくなるまでiから0までループFORを開始します。ループ内で、arr [i] =arr [i] / size

      を設定します
  • 結果を印刷します。

#include <bits/stdc++.h>
using namespace std;
void Rearrangement(int arr[], int size){
   for(int i=0; i < size; i++){
      int temp = arr[arr[i]] % size;
      arr[i] += temp * size;
   }
   for(int i = 0; i < size; i++){
      arr[i] = arr[i] / size;
   }
}
int main(){
   //input an array
   int arr[] = {0, 3, 2, 1, 5, 4};
   int size = sizeof(arr) / sizeof(arr[0]);
   //print the original Array
   cout<<"Array before Arrangement: ";
   for (int i = 0; i < size; i++){
      cout << arr[i] << " ";
   }
   //calling the function to rearrange the array
   Rearrangement(arr, size);
   //print the array after rearranging the values
   cout<<"\nRearrangement of an array so that arr[i] becomes arr[arr[i]] with O(1) extra space is: ";
   for(int i = 0; i < size; i++){
      cout<< arr[i] << " ";
   }
   return 0;
}

出力

上記のコードを実行すると、次の出力が生成されます

Array before Arrangement: 0 3 2 1 5 4
Rearrangement of an array so that arr[i] becomes arr[arr[i]] with O(1) extra space is: 0 1 2 3 4 5

  1. C ++のO(1)空間で要素0からN-1の定数配列で重複を検索します

    0からn-1までの数字のリストがあるとします。数は可能な限り何度でも繰り返すことができます。余分なスペースをとらずに繰り返し番号を見つける必要があります。 n =7の値で、リストが[5、2、3、5、1、6、2、3、4、5]のような場合。答えは5、2、3になります。 これを解決するには、次の手順に従う必要があります- リスト内の各要素eについて、次の手順を実行します- sign:=A[eの絶対値] 符号が正の場合は負にします それ以外の場合は繰り返しです。 例 #include<iostream> #include<cmath> using namespace

  2. C++の整数の配列で最大の積を持つペアを見つけます

    配列Aがあるとすると、n個の異なる要素があります。 xとyの積が最大になるように、配列Aからペア(x、y)を見つける必要があります。配列には正または負の要素が含まれる場合があります。配列がA=[-1、-4、-3、0、2、-5]のようであるとすると、積が最大になるため、ペアは(-4、-5)になります。 この問題を解決するには、positive_max、positive_second_max、negative_max、negative_second_maxの4つの数値を追跡する必要があります。最後に、(positive_max *positive_second_max)が(negative_ma