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

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 が出力されます。

  1. Pythonで特定の年の最初の日(1月1日の曜日)を取得する方法

    このプログラムでは、指定した年の最初の日(1月1日)が何曜日にあたるかを出力します。対象となる年は、ユーザーからの入力として受け取ります。処理の流れ(アルゴリズム)ステップ1:datetimeライブラリをインポートする。 ステップ2:ユーザーから年を入力として受け取る。 ステップ3:datetime.datetime()関数に「年・月・日」を引数として渡し、その年の最初の日を取得する。 ステップ4:strftime()関数を使って、最初の日の曜日を表示する。サンプルコードimport datetime year = int(input(Enter year: )) firstday = dat

  2. Pythonで整数の桁数を求める方法をわかりやすく解説

    この記事では、ユーザーから入力された整数の桁数を求めるPythonプログラムを紹介します。初心者にもわかりやすいように、アルゴリズムの考え方からサンプルコード、実行結果まで順を追って解説していきます。 実行例 入力:123 → 出力:3入力:1987 → 出力:4 アルゴリズム 桁数を求める基本的な流れは以下の通りです。 ユーザーから整数値を入力として受け取ります。 数値を10で割り、その商を整数型(int)に変換します。 商が0でなければ、桁数のカウントを1つ増やします。 商が0になった時点でカウントを終了します。 処理を終了し、桁数を出力します。 サンプルコード x = int(