配列の連続した部分配列から合計数を数える


12

すべてa [ i ] > 0の配列が与えられますa[1n]a[i]>0

今、私たちは部分配列は、配列、すなわち、連続した範囲のです(そのサブアレイから形成することができますどのように多くの異なる合計見つける必要がある[ J ... K ]いくつかのために、合計は全ての和でありますサブアレイの要素)。例えば、場合、その後、答えは4:我々が形成することができる。a[jk]j,ka=[1,2,1]1,2,3,4

時間で個別の合計数をカウントする方法を知っています。O(n2)

さらに、私はこれが文字列の異なる部分文字列の数を見つける必要がある古典的な問題に似ていることに気付きました。私は、サフィックス配列を構築し、同様の方法で解決する可能性を考えていました(時間)。しかし、私はここで動作するようにそれを変更する方法を理解することができませんでした。たとえば、接尾辞配列を使用すると、4つの許容可能なケースの代わりに5つのケースが取得されます。これは、接尾辞配列を使用してこれを行うことは可能ですか、それとも間違った方向に考えていますか?O(n)a=[1,2,1]

また、私が考えてきたもう1つの方向があります。分割して征服します。配列を1つの要素に縮小されるまで毎回2つの部分に分割する場合のように。1つの要素に1つの合計を含めることができます。2つの単一要素を組み合わせる場合、2つの方法で実行できます。両方の単一範囲に同じ要素がある場合、2つの異なる合計を取得するか、両方に異なる要素がある場合、3つの異なる合計を取得します。しかし、長さが1より大きい配列をマージするためにこれを一般化することはできません。2つのmサイズの配列をマージして答えを取得することは可能ですか?O(m)


O(n lg n)

次の問題から始めることをお勧めします。同じ合計の間隔が2つあるかどうかを判断するのはどれくらい難しいですか。この問題の3SUMの難しさを証明するのは魅力的ですが、今のところできませんでした。
ユヴァルフィルマス

回答:


2

O(n2)Θ(n2)

[1,2,4,8,,2n]n(n+1)2


「ほぼ確実」は、問題が出力として合計の値を必要としないという事実によるものです。ただし、少なくともほとんどの値を決定しないと重複を回避できないと思います。


正しい答えを考え出している間、すべての可能性を乗り越えることをどうにかして避ける方法があるべきでない特別な理由を私は見ない。ダイナミックプログラミングアルゴリズムはそれを定期的に行います。
ユヴァルフィルマス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.