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

Pythonで1次元配列の累積和(ランニングサム)を求める方法

問題の概要

配列 nums が与えられたとします。配列の「ランニングサム(累積和)」とは、rs[i]nums[0] から nums[i] までのすべての要素の合計を表す新しい配列のことです。最終的には、nums 全体のランニングサムを返します。

例えば、入力が nums = [8,3,6,2,1,4,5] の場合、出力は [8, 11, 17, 19, 20, 24, 29] となります。その理由は以下の通りです。

rs[0] = nums[0]
rs[1] = nums[0..1] の合計 = 8 + 3 = 11
rs[2] = nums[0..2] の合計 = 8 + 3 + 6 = 17
以下同様に続く

解決の手順

この問題を解くには、以下の手順に従います。

  • n := nums のサイズ
  • rs := [nums[0]](最初の要素で初期化)
  • i を 1 から n-1 まで繰り返す:
    • nums[i] := nums[i] + nums[i-1]
    • rs の末尾に nums[i] を追加
  • rs を返す

Pythonでの実装例

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

def solve(nums):
    n = len(nums)
    rs = [nums[0]]

    for i in range(1, n):
        nums[i] += nums[i-1]
        rs.append(nums[i])
    return rs

nums = [8,3,6,2,1,4,5]
print(solve(nums))

入力

[8,3,6,2,1,4,5]

出力

[8, 11, 17, 19, 20, 24, 29]

別のアプローチ:itertools.accumulate を使う

Pythonでは、標準ライブラリの itertools.accumulate を利用すると、同じ結果をより簡潔なコードで得ることができます。

from itertools import accumulate

nums = [8,3,6,2,1,4,5]
print(list(accumulate(nums)))
# 出力: [8, 11, 17, 19, 20, 24, 29]

どちらの方法でも計算量は O(n) となり、配列を一度走査するだけで累積和を求められます。手動で実装する場合はアルゴリズムの仕組みがよく分かり、itertools を使う場合は可読性と簡潔さが向上するというメリットがあります。

  1. Pythonで配列の合計を求める方法を徹底解説

    この記事では、Pythonを使って配列(リスト)の合計を求める方法について詳しく解説します。 問題文 問題: 配列が与えられたとき、その配列に含まれるすべての要素の合計を計算してください。 最も基本的なアプローチは、配列全体を走査し、各インデックスの要素を順番に加算していく方法です。ここでは、まず組み込み関数を活用したシンプルな実装例を見ていきましょう。 方法1:組み込み関数 sum() を使う Pythonには、イテラブルなオブジェクトの合計を一発で計算できる組み込み関数 sum() が用意されています。これを使えば、コードは非常に簡潔になります。 サンプルコード # 合計を求める関数 de

  2. Pythonで配列(リスト)の合計を求める方法をわかりやすく解説

    この記事では、配列(リスト)の合計値を求めるという問題に対して、Pythonでの解決策とアプローチをわかりやすく解説します。 問題の定義 配列が入力として与えられたとき、その配列に含まれるすべての要素の合計を計算することを目標とします。 例えば、[1, 2, 3, 4, 5] という配列が与えられた場合、出力は 15 になります。 アプローチ1:ループを使った素朴な方法(総当たり法) 最も基本的な方法は、リストを先頭から順に走査し、各要素を合計用の変数に加算していくやり方です。手順は以下の通りです。 合計を格納する変数を 0 で初期化します。 for ループでリストの各要素を取り出し、順番に