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

Pythonで方程式 yi + yj + |xi − xj| の最大値を求めるプログラム

2次元平面上の座標点を格納した配列 points があるとします。各要素は points[i] = (x_i, y_i) という形式で表され、点は x 座標の昇順にソートされているため、すべての 1 <= i < j <= 点数 について x_i < x_j が成り立ちます。さらに、整数値 k も与えられます。

このとき、|x_i - x_j| <= k かつ 1 <= i < j <= 点数 を満たすすべての組み合わせの中から、方程式 y_i + y_j + |x_i - x_j| の最大値を求めるのが目的です。

たとえば、入力が points = [[2,4],[3,1],[6,11],[7,-9]]k = 1 の場合、出力は 6 になります。最初の2つの点は条件 |x_i - x_j| <= 1 を満たしており、方程式に代入すると 4 + 1 + |2 - 3| = 6 となります。同様に、3番目と4番目の点も条件を満たしますが、11 + (-9) + |6 - 7| = 3 しか得られないため、最大値は 6 になります。

解法のアプローチ

この問題は、左右2つのポインタ(インデックス)を使った「スライディングウィンドウ」的な手法で効率的に解くことができます。手順は以下の通りです。

  • left := 0right := 1 で初期化する

  • max_value := -inf(負の無限大)で初期化する

  • right が points のサイズ未満である間、以下を繰り返す:

    • (xl, yl) := points[left]

    • (xr, yr) := points[right]

    • diff := |xr - xl| を計算する

    • left == right の場合: right := right + 1

    • diff <= k の場合:

      • m := yl + yr + diff を計算する

      • max_value := max(max_value, m) で最大値を更新する

      • yl >= yr - diff の場合: right := right + 1

      • それ以外の場合: left := left + 1

    • それ以外(diff > k の場合): left := left + 1

  • 最後に max_value を返す

実装例

理解を深めるために、以下の Python 実装を見てみましょう。

def solve(points, k):
   left, right = 0, 1
   max_value = float('-inf')

   while right < len(points):
      xl, yl = points[left]
      xr, yr = points[right]

      diff = abs(xr - xl)
      if left == right:
         right += 1
      elif diff <= k:
         m = yl + yr + diff
         max_value = max(max_value, m)
         if yl >= yr - diff:
            right += 1
         else:
            left += 1
      else:
         left += 1

   return max_value

points = [[2,4],[3,1],[6,11],[7,-9]]
k = 1
print(solve(points, k))

入力

[[2,4],[3,1],[6,11],[7,-9]], 1

出力

6

  1. Pythonで有向グラフにおける最大の色の値を見つけるプログラム

    この問題では、n個の色付きノードとm個の異なるエッジから構成される有向グラフが与えられます。ノードには0からn-1までの番号が付けられています。小文字アルファベットのみで構成された文字列colがあり、col[i]はグラフ内のi番目のノード(0インデックス)の色を表します。さらに、edges[j] = (u, v)という形式のエッジリストが与えられ、ノードuからノードvへ向かう有向エッジが存在することを示します。 グラフにおける「有効なパス」とは、ノードの系列 x₁ から xₖ までの並びであり、隣接する任意の xᵢ と xᵢ₊₁ の間に、xᵢ から xᵢ₊₁ へ向かう有向エッジが存在するものを

  2. Pythonで配列内の最大要素を見つける方法【初心者向け解説】

    本記事では、配列の中から最大の要素を見つけるための解法とアプローチについて詳しく解説します。 問題の概要 配列が入力として与えられたとき、その中から最も大きい要素を見つけ出すことが課題となります。 アプローチ この問題は「線形探索」と呼ばれるシンプルな手法で解決できます。手順は以下の通りです。 まず、変数 max を配列の最初の要素で初期化します。 次に、2番目の要素から配列の末尾まで順番に走査していきます。 走査中の各要素について、現在の max の値と比較します。 要素が max より大きければ、max の値をその要素で更新します。 そうでなければ、そのまま次の要素へ進みます。 この処