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

C ++を使用して、サイズnのソートされた配列内の唯一の繰り返し要素を検索します


この問題では、1からN-1までの値を含むサイズNのarr []が与えられ、1つの値が配列内で2回発生します。私たちのタスクは、サイズnのソートされた配列内の唯一の繰り返し要素を見つけることです

問題を理解するために例を見てみましょう

入力

arr[] = {1, 2, 3, 4, 5, 5, 6, 7}

出力

5

ソリューションアプローチ

この問題を解決する簡単な方法は、線形探索を使用して、arr[i]とarr[i+1]の値が同じかどうかを確認することです。この場合、繰り返される値であるarr[i]を返します。

例1

ソリューションの動作を説明するプログラム

#include <iostream>
using namespace std;
int findRepeatingValueArr(int arr[], int N){
   for(int i = 0; i < N; i++){
      if(arr[i] == arr[i+1])
         return (arr[i]);
   }
   return -1;
}
int main(){
   int arr[] = {1, 2, 3, 4, 4, 5, 6};
   int N = sizeof(arr)/sizeof(arr[0]);
   cout<<"The repeating value in the array is "<<findRepeatingValueArr(arr, N);
   return 0;
}

出力

The repeating value in the array is 4

この問題を解決する別のアプローチは、バイナリ検索アルゴリズムを使用して、中間インデックスで2回発生した要素を見つけることです。中央のインデックス値が繰り返される場合は、それを出力します。インデックス位置にない場合は、右のサブアレイをトラバースします。そうでない場合は、左のサブアレイをトラバースします。

例2

ソリューションの動作を説明するプログラム

#include <bits/stdc++.h>
using namespace std;
int findRepeatingValueArr(int arr[], int s, int e){
   if (s > e)
      return -1;
   int mid = (s + e) / 2;
   if (arr[mid] != mid + 1){
      if (mid > 0 && arr[mid]==arr[mid-1])
         return arr[mid];
         return arr[findRepeatingValueArr(arr, s, mid-1)];
   }
   return arr[findRepeatingValueArr(arr, mid+1, e)];
}
int main(){
   int arr[] = {1, 2, 3, 4, 5, 6, 6, 7, 8, 9};
   int n = sizeof(arr) / sizeof(arr[0]);
   cout<<"The repeating value in the array is "<<findRepeatingValueArr(arr, 0, n-1);;
   return 0;
}

出力

The repeating value in the array is 6

  1. C ++を使用して、配列内の数値の頻度を見つけます。

    配列があるとします。 n個の異なる要素があります。配列内の1つの要素の頻度を確認する必要があります。 A =[5、12、26、5、3、4、15、5、8、4]とすると、5の頻度を見つけようとすると、3になります。 これを解決するために、左から配列をスキャンします。要素が指定された数と同じである場合は、カウンターを増やします。それ以外の場合は、配列がなくなるまで次の要素に進みます。 例 #include<iostream> using namespace std; int countElementInArr(int arr[], int n, int e) {   &nbs

  2. C++のRotatedSorted配列でRotationCountを検索します

    回転してソートされた配列である配列があるとします。配列をソートするために必要な回転数を見つける必要があります。 (右から左への回転を検討します。) 配列が{15、17、1、2、6、11}のようであるとすると、配列を2回回転させて並べ替える必要があります。最終的な注文は{1、2、6、11、15、17}になります。ここでの出力は2です。 ロジックは単純です。気づいたら、回転数が最小要素のインデックスの値と同じであることがわかります。したがって、最小の要素を取得すると、そのインデックスが結果になります。 例 #include <iostream> using namespace st