C++で解くパスカルの三角形 II:k行目を効率的に求めるアルゴリズム
パスカルの三角形 II とは
0 以上のインデックス k(k ≤ 33)が与えられたとき、パスカルの三角形の k 行目を求める問題を考えてみましょう。
例えば、入力が 3 の場合、出力は [1, 3, 3, 1] となります。
パスカルの三角形とは、各行の両端が 1 であり、それ以外の要素が直上の行の左右隣接する2つの値の和になるという性質を持つ三角形です。この問題では、空間計算量 O(k) だけを使って、指定された行のみを効率的に生成することが求められます。
解法のアプローチ
この問題は「1次元配列をその場で更新する(in-place更新)」テクニックを使うことで、追加の配列を用意せずに解くことができます。手順は以下の通りです。
- サイズが rowIndex + 1 の配列 pascal を定義し、すべて 0 で初期化します。
- r = 0 から rowIndex まで、以下を繰り返します。
- pascal[r] := 1 とし、prev := 1 を設定します。
- i = 1 から r - 1 まで、以下を繰り返します。
- cur := pascal[i] として現在の値を退避させます。
- pascal[i] := pascal[i] + prev と更新します。
- prev := cur として退避した値を引き継ぎます。
- 最後に pascal を返します。
ポイントは、配列を左から右へ走査しながら更新する際に、更新前の値を一時変数 prev / cur で保持しておくことです。これにより、前の行の情報を失うことなく、1つの配列だけで行を順次構築できます。
C++での実装例
理解を深めるために、以下の実装を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> pascal(rowIndex + 1, 0);
int prev, cur, r, i;
for (r = 0; r <= rowIndex; r++) {
pascal[r] = prev = 1;
for (i = 1; i < r; i++) {
cur = pascal[i];
pascal[i] += prev;
prev = cur;
}
}
return pascal;
}
};
main(){
Solution ob;
print_vector(ob.getRow(3));
}入力
3
出力
[1, 3, 3, 1]
計算量について
このアルゴリズムの時間計算量は O(k²) です。外側のループが k 回、内側のループが最大で k 回回るためです。一方、空間計算量は出力用の配列を除けば O(1)、つまり追加の領域をほとんど必要としないのが大きな特徴です。二項係数を直接計算する方法もありますが、オーバーフローや割り算の扱いに注意が必要なため、このような漸化式による構築方法は安全で分かりやすいアプローチと言えます。
-
C++で三角形の重心を求めるプログラムの作成方法
この記事では、三角形の3つの頂点の座標を格納した2次元配列が与えられたときに、その三角形の重心を求めるC++プログラムの作成方法を解説します。 三角形の重心とは、三角形の3本の中線がすべて交わる点のことです。 また、三角形の中線とは、ある頂点と、その対辺(向かい合う辺)の中点を結ぶ線分のことを指します。 それでは、具体的な例を使って問題を確認してみましょう。 入力 (-3, 1), (1.5, 0), (-3, -4) 出力 (-1.5, -1) 説明 重心 (x, y) = ((-3 + 1.5 - 3) / 3, (1 + 0 - 4) / 3) = (-1.5, -1) 解法のアプロ
-
C++で平行四辺形に内接する三角形の面積を計算する方法
図形の面積とは、その図形が二次元平面上で占める広さのことです。三角形は、3つの辺を持つ多角形です。平行四辺形は、向かい合う2組の辺がそれぞれ平行で、長さも等しい四角形です。問題の概要このプログラムでは、底辺と高さがわかっている平行四辺形を扱います。この平行四辺形の中には、平行四辺形と同じ底辺を共有する三角形が内接しています。与えられた底辺と高さの値を使って、この三角形の面積を計算することが目的です。三角形の面積の公式平行四辺形の底辺をそのまま使い、平行四辺形と同じ高さを持つ三角形の面積は、次の公式で求められます。面積 = ½ × 底辺(b) × 高さ(h)つまり、面積 = 0.5 × b ×