C#でターゲットに最も近い一意のトリプレット(3つの数の合計)を見つける方法
この問題は「Two Pointers(双方向ポインタ)」パターンを用いて解くことができ、「Triplet Sum to Zero(合計がゼロになるトリプレット)」の問題とよく似ています。基本的なアプローチとしては、配列をソートした上で、1つの要素を固定しながら残りの2つの要素をポインタで探索していきます。
各ステップでは、現在のトリプレットの合計とターゲット値との差を記録し、それまでに見つかった最小の差と比較します。これにより、探索が終わった時点で、ターゲットに最も近い合計を持つトリプレットを返すことができます。
計算量
時間計算量
配列のソートには O(N * logN) かかります。全体の ThreeSumClosest() の処理は O(N * logN + N²) となり、漸近的には O(N²) と同等です。
空間計算量
このアルゴリズムの空間計算量は O(N) で、これはソートに必要な分です。
実装例
public class Arrays{
public int ThreeSumClosest(int[] num, int target){
if (num == null || num.Length == 0){
return -1;
}
int[] nums = num.OrderBy(x => x).ToArray();
int initialclosest = nums[0] + nums[1] + nums[2];
for (int i = 0; i < nums.Count(); i++){
int left = i + 1;
int right = nums.Length - 1;
while (left < right){
int newClosest = nums[i] + nums[left] + nums[right];
if (Math.Abs(newClosest - target) < Math.Abs(initialclosest - target)){
initialclosest = newClosest;
}
if (newClosest == target){
return newClosest;
}
else if (newClosest < target){
left++;
}
else
{
right--;
}
}
}
return initialclosest;
}
}
static void Main(string[] args){
Arrays s = new Arrays();
int[] nums = { -1, 2, 1, -4 };
Console.WriteLine(s.ThreeSumClosest(nums, 1));
}出力結果
2
この例では、入力配列 { -1, 2, 1, -4 } に対してターゲット値 1 を指定しています。-1 + 2 + 1 = 2 がターゲットに最も近い合計となるため、結果として 2 が出力されます。
-
Pythonで特定の年の最初の日(1月1日の曜日)を取得する方法
このプログラムでは、指定した年の最初の日(1月1日)が何曜日にあたるかを出力します。対象となる年は、ユーザーからの入力として受け取ります。処理の流れ(アルゴリズム)ステップ1:datetimeライブラリをインポートする。 ステップ2:ユーザーから年を入力として受け取る。 ステップ3:datetime.datetime()関数に「年・月・日」を引数として渡し、その年の最初の日を取得する。 ステップ4:strftime()関数を使って、最初の日の曜日を表示する。サンプルコードimport datetime year = int(input(Enter year: )) firstday = dat
-
Pythonで整数の桁数を求める方法をわかりやすく解説
この記事では、ユーザーから入力された整数の桁数を求めるPythonプログラムを紹介します。初心者にもわかりやすいように、アルゴリズムの考え方からサンプルコード、実行結果まで順を追って解説していきます。 実行例 入力:123 → 出力:3入力:1987 → 出力:4 アルゴリズム 桁数を求める基本的な流れは以下の通りです。 ユーザーから整数値を入力として受け取ります。 数値を10で割り、その商を整数型(int)に変換します。 商が0でなければ、桁数のカウントを1つ増やします。 商が0になった時点でカウントを終了します。 処理を終了し、桁数を出力します。 サンプルコード x = int(