Pythonで指定されたn辺の多角形(ポリゴン)を作成できるかどうかを判定する方法
長さ n の辺の長さが格納された配列 nums が与えられたとします。このとき、与えられたすべての辺を使って多角形(ポリゴン)を作成できるかどうかを判定する必要があります。
例えば、入力が nums = [3, 4, 5] の場合、出力は True になります。これは3つの辺があり、どの2辺の和も残りの1辺より大きいためです。この問題を解くには、「ある一辺の長さは、それ以外のすべての辺の長さの総和より小さい」という性質を利用します。
解法のアプローチ
この問題は、以下の手順で解くことができます。
- リスト
numsをソートする numsの最後の要素(最大値)が、それ以外の要素の総和より小さい場合はTrueを返す- それ以外の場合は
Falseを返す
最大の辺が他の辺の合計以上になってしまうと、その辺で図形を「閉じる」ことができず、多角形が成立しないためです。ソートを行うことで、最大値だけをチェックすればよいことになります。
実装例
以下の実装を見ると、理解が深まります。
def solve(nums):
nums.sort()
if nums[-1] < sum(nums[:-1]):
return True
return False
nums = [3, 4, 5]
print(solve(nums))入力
[3, 4, 5]
出力
True
計算量について
このアルゴリズムの時間計算量は、ソートに依存して O(n log n) となります。空間計算量は、ソートの実装方法によりますが、一般的には O(1)〜O(n) です。なお、実はソートを省略して全体の総和と最大値を一度の走査で求めれば、O(n) で判定することも可能です(max(nums) * 2 < sum(nums) を確認する方法)。
-
PythonのBST(二分探索木)に指定した合計になるトリプレットが存在するか判定する方法
問題概要 整数値を持つ二分探索木(BST)と、ある数値「total」が与えられたとします。このとき、BSTの中から3つの要素を選び、その合計が「total」と一致するような組み合わせ(トリプレット)が存在するかどうかを判定するのが、本記事のテーマです。 例えば、次のようなBSTが入力として与えられた場合を考えてみます。 total = 12 の場合、出力は True になります。 解法のアプローチ この問題は、BSTを中順走査(inorder traversal)するとノードの値が昇順に並ぶという性質を利用することで、効率的に解くことができます。全体の流れは以下の通りです。 結果を格納する
-
Pythonで点がポリゴンの内側または境界上にあるかどうかを判定するプログラム
問題の概要 直交座標系の点のリスト [(x1, y1), (x2, y2), ..., (xn, yn)] が1つのポリゴン(多角形)を表しているとします。ここに、判定対象となる点 (x, y) が与えられたとき、その点がこのポリゴンの内側、あるいは境界上に存在するかどうかを判定するのが本記事のテーマです。 例として、次のような入力を考えてみましょう。 points = [(0, 0), (1, 3), (4, 4), (6, 2), (4, 0)] pt = (3, 1) この場合、点 (3, 1) はポリゴンの内部にあるため、出力は True となります。 解決のアプローチ この問題は