C++で範囲内の欠落している数値を見つける方法
この問題では、サイズ n の配列 arr[] が与えられ、範囲内で欠落している1つの数値を見つけることが求められます。
配列には、最小値から(最小値 + n)までの連続する整数がすべて含まれていますが、そのうち1つだけが欠落しています。私たちのタスクは、この欠落した数値を特定することです。
具体例で問題を確認してみましょう。
入力:
arr[] = {4, 8, 5, 7}
出力:
6
解決アプローチ
方法1: ソートを利用した単純な解法
最も基本的な解決策は、配列をソートした後、最小値から始まる範囲の要素を順番に確認し、範囲内に存在するはずなのに配列に現れない最初の要素を探す方法です。
ただし、この方法は素朴なアプローチであり、時間計算量は O(n log n) となります。
方法2: XOR(排他的論理和)を利用した効率的な解法
より短い時間で解決したい場合は、XOR演算を活用する方法が効果的です。まず範囲内のすべての値のXORを計算し、次に配列内のすべての値のXORを計算します。同じ数値同士のXORは0になるという性質を利用すると、この2つの結果をXORした値が、そのまま欠落している数値になります。
実装例
この解法の動作を示すプログラムは以下の通りです。
#include <bits/stdc++.h>
using namespace std;
int findMissingNumArr(int arr[], int n){
int arrMin = *min_element(arr, arr+n);
int numXor = 0;
int rangeXor = arrMin;
for (int i = 0; i < n; i++) {
numXor ^= arr[i];
arrMin++;
rangeXor ^= arrMin;
}
return numXor ^ rangeXor;
}
int main(){
int arr[] = { 5, 7, 4, 8, 9};
int n = sizeof(arr)/sizeof(arr[0]);
cout<<"The missing value in the array is "<<findMissingNumArr(arr, n);
return 0;
}
出力
The missing value in the array is 6
-
C++で等差数列から欠けている要素を二分探索で効率的に見つける方法
問題の概要 等差数列の要素が順番に並んだ配列が与えられますが、そのうち1つの要素が欠けています。この欠けている要素を見つけるのが本記事の目的です。 例えば、配列が arr = [2, 4, 8, 10, 12, 14] の場合、公差は2であり、6が欠けているため、出力は 6 となります。 アルゴリズムのポイント:二分探索の活用 この問題は二分探索を使うことで、O(log n)の計算量で効率的に解くことができます。基本的な考え方は以下のとおりです。 まず配列の中央の要素に着目します。 中央の要素とその次の要素の差が、公差(diff)と一致しているかどうかを確認します。 一致しない場合、欠けてい
-
C++で配列内の数値の頻度(出現回数)を求める方法
配列に n 個の異なる要素が格納されているとします。この配列の中から、特定の要素が何回出現するか(頻度)を調べたい場合があります。例えば、配列 A = [5, 12, 26, 5, 3, 4, 15, 5, 8, 4] の中で「5」の頻度を調べると、答えは 3 になります。アルゴリズムの考え方この問題は、次の手順で解くことができます。1. 配列を左端から順に走査します。2. 現在の要素が調べたい数値と一致したら、カウンターを1つ増やします。3. 一致しない場合は、そのまま次の要素へ進みます。4. 配列の最後まで走査したら、カウンターの値が頻度となります。このアルゴリズムの計算量は O(n) で