C++で配列の値から三角形を形成できるかどうかを判定する方法
この問題では、整数の配列が与えられ、その配列の要素を辺として使って非退化三角形を作成できるかどうかを判定します。
非退化三角形とは
非退化三角形とは、面積が正(0より大きい)となる三角形のことです。辺を a、b、c とする三角形が非退化であるための条件は以下の通りです。
a + b > c a + c > b b + c > a
問題例
具体的な例を見てみましょう。
- 入力:arr[2, 5, 9, 4, 3]
- 出力:Yes
- 説明:2、3、4 を辺とする三角形が形成できます。
解決アプローチ
この問題を解くには、配列の値が上記の条件を満たすかどうかを確認します。
素朴な解法としては、配列内のすべての三つ組(トリプレット)を直接チェックする方法が考えられます。しかし、これは計算量が O(N³) となり、配列が大きくなると非効率です。
より効率的な解法は、まず配列の要素をソートし、その後連続する3つの要素を順にチェックする方法です。ソート済みの配列では、隣接する2つの要素の和が次の要素以下であれば、それ以降の値をチェックする必要はありません(後続の値はさらに大きいため、条件を満たさないことが確定するからです)。この方法なら計算量は O(N log N) に抑えられます。
実装例
上記の解法を実装したプログラムは以下の通りです。
#include <bits/stdc++.h>
using namespace std;
bool isTrianglePossible(int arr[], int N){
if (N < 3)
return false;
sort(arr, arr + N);
for (int i = 0; i < N - 2; i++)
if (arr[i] + arr[i + 1] > arr[i + 2])
return true;
}
int main() {
int arr[] = {5, 12, 13, 65, 6, 1};
int N = sizeof(arr) / sizeof(int);
cout<<"Creation of triangle from elements of array ";
isTrianglePossible(arr, N)?cout<<"is Possible": cout<<"is not Possible";;
return 0;
}
出力結果
Creation of triangle from elements of array is Possible
まとめ
配列の要素から三角形を形成できるかを判定する問題は、ソートを活用することで効率的に解くことができます。ポイントは、ソート後に「最小の2辺の和が最大の辺より大きいか」を連続する3要素で確認すれば十分だという点です。このテクニックは、他の幾何学的な判定問題にも応用できるので、ぜひ覚えておきましょう。
-
C++の関数から複数の値を返す方法【ポインタ渡しと参照渡し】
C言語やC++では、関数から複数の値を直接返すことはできません。return文で返せる値は基本的に1つだけだからです。しかし、「ポインタ渡し(call by address)」や「参照渡し(call by reference)」といったテクニックを使えば、実質的に複数の値を呼び出し元に返すことが可能です。この記事では、1つの関数から2つの数値を割り算した「商」と「余り」を同時に取得する例を通して、その具体的な方法を解説します。方法1:ポインタ渡し(Call By Address)ポインタ渡しでは、結果を格納するための変数を呼び出し側で用意し、その変数のアドレスを関数に渡します。関数内ではポイン
-
【C++入門】関数から配列を返す方法|ポインタとstatic変数を使った実装テクニック
C++では、配列全体をそのまま関数の戻り値として返すことはできません。しかし、配列へのポインタを返すことで、実質的に同じ目的を達成することが可能です。ここで注意すべき点が1つあります。関数内で宣言された通常のローカル変数(自動変数)は、関数の処理が終了すると同時にメモリから破棄されるため、そのアドレスを関数の外へ返しても正しく動作しません。この問題を解決するのがstatic変数です。ローカル変数を static として宣言すると、その変数はプログラムの実行中ずっとメモリ上に保持されるため、関数が終了した後もアドレスを安全に参照できるようになります。ポインタを返す関数の基本構文配列へのポインタを